fread()C中的怪异行为

时间:2015-03-13 03:29:02

标签: c file

当我尝试通过不同的方法设置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 循环时注释掉),程序会生成预期结果。

我不知道为什么会发生这样的事情。有人指出我哪里出错了?任何建设性的帮助将不胜感激。谢谢。

1 个答案:

答案 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)
...

应解决问题。