当我尝试通过不同的方法设置max
时,我的代码表现得很奇怪。
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
int max=0;
FILE* fp=fopen(argv[1],"r");
FILE* fp1=fopen(argv[2],"w");
while(fgetc(fp)!=EOF)
++max;
//printf("\n%d\n",max); //933
char *s=(char*)calloc(max,sizeof(char));
if(fread(s,sizeof(char),max,fp)==max)
fwrite(s,sizeof(char),max,fp1);
else
fprintf(stderr,"\nError reading file %s\n",argv[1]);
fclose(fp);
fclose(fp1);
return 0;
}
从代码中可以看出,我使用 while 循环来查找文件的大小(以no.of为单位)并将其设置为max
。当{{ 1}}尝试使用&#34读取文件fread
;此&#34; max它会引发一个错误,即
argv[1]
返回0.
但是,当我使用已知文件大小初始化fread(s,sizeof(char),max,fp)
时(按照上一种方法计算,同时在 while 循环时注释掉),程序会生成预期结果。
我不知道为什么会发生这样的事情。有人指出我哪里出错了?任何建设性的帮助将不胜感激。谢谢。
答案 0 :(得分:3)
正如@BLUEPIXY在评论中暗示的那样,计算max
的第一个操作序列具有将读取位置设置为文件末尾的副作用。
因此,任何旨在获取数据的后续fread
都会失败,因为不再需要获取数据。使用以下命令将读取位置重置为文件的开头:
while(fgetc(fp)!=EOF)
++max;
rewind(fp); // <------------------ reset read location to start of file.
// go on to read the data
char *s=(char*)calloc(max,sizeof(char));
if(fread(s,sizeof(char),max,fp)==max)
...
应解决问题。