!=EOF 和 !feof() 的差别

用 C 写了一个读文件的函数,读普通文本没有问题,可是当读取一些二进制文件时就出现问题了–函数总是没法把文件的所有内容读出来。

郁闷了两天,终于找到答案。

原程序:

void bFile2str(String fpath, String& rStr){
  FILE* infile;
  infile = fopen (fpath.c_str(), “rb”);
  if (infile == NULL) {
    MessageBox(NULL, “Fail to open file, please check your path …” , “Error” , MB_ICONWARNING);
    return;
  }
  char cTemp;
  int i=1;
  cTemp = fgetc(infile);
  while (cTemp != EOF) {
    rStr = rStr + ” “;
    rStr[i] = cTemp;
    cTemp = fgetc(infile);
    i ++;
  } 
  fclose(infile);
}

后来改成:

void bFile2str(String fpath, String& rStr){
  FILE* infile;
  infile = fopen (fpath.c_str(), “rb”);
  if (infile == NULL) {
    MessageBox(NULL, “Fail to open file, please check your path …” , “Error” , MB_ICONWARNING);
    return;
  }
  char cTemp;
  int i=1;
  cTemp = fgetc(infile);
  while (!feof(infile)) {
    rStr = rStr + ” “;
    rStr[i] = cTemp;
    cTemp = fgetc(infile);
    i ++;
  } 
  fclose(infile);
}

分析: 分析有误,请看评论。
EOF 是文件结束符,当 fgetc 读字符时遇到文件结束符时, 将返回一个文件结束标志 EOF(即-1)。如果是普通文本,当然可以用EOF来判断是否已到文件尾,但在二进制文件中可能包含多个 EOF 标志符,这时就会出现文件还没读完就被认为文件已经结束的情况。而 feof() 就解决了这个问题,它可以用来测试当前文件指针是否在文件尾,它和 EOF 的机理完全不同,当然会跳过中间的许多 EOF 字符。

— EOF —

24 thoughts on “!=EOF 和 !feof() 的差别”

  1. 根本没有什么文件结束符。
    如果有的话空文件不是还要占一个字节的结束符?
    EOF是什么?它就是-1。它不过是C例程里的一个常量,当碰到文件结尾时,就返回-1。

    问题的根本是你错误的认为磁盘的文件结尾还有一个字符专门表示文件的结束,呵呵,没有这个字符,你想啊,每读一个字符还要比较一下它是否等于“空想的文件结束符“,是不是太低效了点呢。那是如何判断文件是否已经结束的?中断、异常。

发表评论

电子邮件地址不会被公开。 必填项已用*标注