feof() 函数的陷阱……

使用feof()的时候,掉陷阱里了,总是少输出一条:

  while ( !feof(fp) ) { flag = fgets(buffer,300,fp); cout << buffer<set_name(temp_name); temp->set_salary(salary); temp->set_group(count); this->add(*temp); }

 

后来是这样:

 

flag = fgets(buffer,300,fp); //先读取一行 while (!feof(fp) || flag != NULL) { cout << buffer<set_name(temp_name); temp->set_salary(salary); temp->set_group(count); this->add(*temp); flag = fgets(buffer,300,fp);//这句和feof()练起来才有效果……最后不至于多读一次,将结束符读出。 }

 

 

百度百科的例子:

 

int c;

  while(!feof(fp))

  {

  c = fgetc(fp);

  printf("%X/n", c);

  }

  会发现多输出了一个FF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。

  正确的写法应该是:

  int c;

  c = fgetc(fp);

  while(!feof(fp))

  {

  printf("%X/n", c);

  c = fgetc(fp);

  }

  feof()可以用EOF代替吗?不可以。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

 

你可能感兴趣的:(C/C++)