较大的字符数组读写问题

lxingbo 2007-03-11 03:45:39
我想写一个小程序可以将A文件中所有AT字母互换, CG字母互换, 然后逆序输出到B文件中. 以下是我写的代码:

#include <stdio.h>
#include <malloc.h>
void main()
{
char ch,temp;
FILE *fp1, *fp2;
long n=0,i=0;
fp1=fopen("A.txt","r");
fp2=fopen("B.txt","w");
while(fgetc(fp1)!=EOF) //统计A文件中字符数
{n++;}
char *str=(char *)malloc(n*sizeof(ch)); //给str分配足够的内存空间
str="";
rewind(fp1);
while((ch=fgetc(fp1))!=EOF) //进行AT,CG互换
{if(ch=='A') str[i]='T';
if(ch=='T') str[i]='A';
if(ch=='C') str[i]='G';
if(ch=='G') str[i]='C';
i++;
}
str[i]='\0';
for(i=n-1;i>=0;i--) 将str逆序写入B文件中
{fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}

代码在turbo C++ 3.0中编译通过, 但是执行后, B文件中出现乱码. 想不明白是哪里的问题. 请高手指教.
...全文
131 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shu_yoyo 2007-10-06
  • 打赏
  • 举报
回复
8楼不错~~~
Hunter8212 2007-10-06
  • 打赏
  • 举报
回复
这么多分啊
来蹭点儿分……
luvi88 2007-10-06
  • 打赏
  • 举报
回复
8楼做得不错。
laiwusheng 2007-10-06
  • 打赏
  • 举报
回复
楼主该不会是学生物的吧
laiwusheng 2007-10-06
  • 打赏
  • 举报
回复
楼上都回答了,我就来蹭点分吧
yydrewdrew 2007-10-05
  • 打赏
  • 举报
回复
#include   <stdio.h> 
#include <malloc.h>
#include <string.h>
void main()
{
char ch,temp;
FILE *fp1,*fp2;
long n=0,i=0;
fp1 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\A.txt","r");
fp2 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\B.txt","w");
if(!fp1 || !fp2)
{
return;
}
while(fgetc(fp1) != EOF) //统计A文件中字符数
{
n++;
}
char *str=(char *)malloc((n * sizeof(ch)) + 1); //给str分配足够的内存空间
strcpy(str,"");
rewind(fp1);
while((ch = fgetc(fp1)) != EOF) //进行AT,CG互换
{
str[i] = ch;
if(ch == 'A') str[i] = 'T';
if(ch == 'T') str[i] = 'A';
if(ch == 'C') str[i] = 'G';
if(ch == 'G') str[i] = 'C';
i++;
}
str[i]= '\0';
for(i = n - 1;i != -1;i--) //将str逆序写入B文件中
{
fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}
yydrewdrew 2007-10-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void main()
{
char ch,temp;
FILE *fp1,*fp2;
long n=0,i=0;
fp1 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\A.txt","r");
fp2 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\B.txt","w");
if(!fp1 || !fp2)
{
return;
}
while(fgetc(fp1) != EOF) //统计A文件中字符数
{
n++;
}
char *str=(char *)malloc((n * sizeof(ch)) + 1); //给str分配足够的内存空间
strcpy(str,"");
rewind(fp1);
while((ch = fgetc(fp1)) != EOF) //进行AT,CG互换
{
str[i] = ch;
if(ch == 'A') str[i] = 'T';
if(ch == 'T') str[i] = 'A';
if(ch == 'C') str[i] = 'G';
if(ch == 'G') str[i] = 'C';
i++;
}
str[i]= '\0';
for(i = n - 1;i != -1;i--) //将str逆序写入B文件中
{
fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}
yydrewdrew 2007-10-05
  • 打赏
  • 举报
回复
尝试贴c++代码:)
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void main()
{
char ch,temp;
FILE *fp1,*fp2;
long n=0,i=0;
fp1 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\A.txt","r");
fp2 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\B.txt","w");
if(!fp1 || !fp2)
{
return;
}
while(fgetc(fp1) != EOF) //统计A文件中字符数
{
n++;
}
char *str=(char *)malloc((n * sizeof(ch)) + 1); //给str分配足够的内存空间
strcpy(str,"");
rewind(fp1);
while((ch = fgetc(fp1)) != EOF) //进行AT,CG互换
{
str[i] = ch;
if(ch == 'A') str[i] = 'T';
if(ch == 'T') str[i] = 'A';
if(ch == 'C') str[i] = 'G';
if(ch == 'G') str[i] = 'C';
i++;
}
str[i]= '\0';
for(i = n - 1;i != -1;i--) //将str逆序写入B文件中
{
fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}
yydrewdrew 2007-10-05
  • 打赏
  • 举报
回复
改了一下,vs2005可以:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void main()
{
char ch,temp;
FILE *fp1,*fp2;
long n=0,i=0;
fp1 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\A.txt","r");
fp2 = fopen("C:\\Documents and Settings\\Rui.2B9F317BD5854FF\\桌面\\example\\B.txt","w");
if(!fp1 || !fp2)
{
return;
}
while(fgetc(fp1) != EOF) //统计A文件中字符数
{
n++;
}
char *str=(char *)malloc((n * sizeof(ch)) + 1); //给str分配足够的内存空间
strcpy(str,"");
rewind(fp1);
while((ch = fgetc(fp1)) != EOF) //进行AT,CG互换
{
str[i] = ch;
if(ch == 'A') str[i] = 'T';
if(ch == 'T') str[i] = 'A';
if(ch == 'C') str[i] = 'G';
if(ch == 'G') str[i] = 'C';
i++;
}
str[i]= '\0';
for(i = n - 1;i != -1;i--) //将str逆序写入B文件中
{
fputc(str[i],fp2);
}
free(str);
fclose(fp1);
fclose(fp2);
}
cceczjxy 2007-10-05
  • 打赏
  • 举报
回复
char *str=(char *)malloc(n*sizeof(ch)); //给str分配足够的内存空间
str="";
...........................
free(str);

这样写,程序没崩溃是你幸运.str又被你指向了一个字符串常量了,free字符串常量是会报内存溢出的错误的.
-------------------------

ningzhiyu 2007-10-04
  • 打赏
  • 举报
回复
1。
str=""; //这里把指针指向了一个字符串常量,指针再不指向申请的动态内存,有大问题……如果是想清零,用memset

2。
//只在str中保存了几个要转换的数据,其他都没有保存下来
while((ch=fgetc(fp1))!=EOF) //进行AT,CG互换
{if(ch== "A ") str[i]= "T ";
if(ch== "T ") str[i]= "A ";
if(ch== "C ") str[i]= "G ";
if(ch== "G ") str[i]= "C ";
i++;
}
rainharder 2007-10-04
  • 打赏
  • 举报
回复
能编译过?
relaxisland 2007-10-03
  • 打赏
  • 举报
回复
单双引号的问题吧
字符是单引号。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧