Turbo C++:while(fin) 与 while(!fin.eof())

Turbo C++ : while(fin) vs while(!fin.eof())

有人告诉我在读取文件时应该使用 while(fin) 而不是 while(!fin.eof())

到底有什么区别?

编辑: 我知道 while(fin) 实际上会检查流对象,当它变为 NULL 时,循环就会中断,它会覆盖 eof 和失败标志。 但是我的课程老师说 fin.eof() 更好,所以我需要了解这里发生的基本操作。

哪一个是正确的做法?

注意:这不是重复的,我需要 Turbo C++ 和二进制文件方面的帮助。 我基本上是在尝试使用 class 对象读取文件。

一个好的方法是这样做:

while ( instream.read(...) && !instream.eof() ) {  //Reading a binary file
      Statement1;
      Statement2;
}

或者如果是文本文件:

while ( (ch = instream.get()) && !instream.eof() ) {  //To read a single character
      Statement1;
      Statement2;
}

这里,在 while 循环的条件语句中读取对象,然后测试 eof 标志的值。 这不会导致不需要的输出。

这里我们正在检查实际 I/O 操作和 eof 的状态。您还可以检查失败标志。

我想指出,根据@RetiredNinja,我们可能只检查 I/O 操作。 即:

while ( instream.read(...) ) {  //Reading a binary file
      Statement1;
      Statement2;
}

首先我假设 fin 是您的 fstream 对象。在这种情况下,您的老师不会告诉您使用 while(fin.eof()) 来读取文件。她会告诉使用 while(!fin.eof()).

让我解释一下。 eof()fstream class 的成员,其中 return 是 truefalse 值,具体取决于文件结尾 (eof)您正在阅读的文件已到达。因此 while eof() function returns 0 表示还没有到达文件末尾,循环继续执行,但是当 eof() returns 1 已到达文件末尾并退出循环。

进入

while(fin)循环是因为fin实际上return是class对象fin中错误标志变量的值,其值已设置当读取或写入或打开等任何功能失败时为 0。因此,只要循环内的读取函数起作用,循环就会起作用。

就我个人而言,我不会推荐其中任何一个。 我会建议

//假设 class abc.

abc ob;


While(fin.read((char*)&ob, sizeof(ob)))
{}

或者

While(fin.getline(parameters))
{}

此循环在循环条件内读取文件记录,如果由于到达文件末尾而没有读取任何内容,则退出循环。

while(!fin.eof()) 的问题是,如果已到达文件末尾,它 returns 1。文件结尾实际上是放在文件末尾的字符。所以当循环内的 read 函数读取这个字符并将变量 eof 设置为 1 时。函数实际上所做的就是 return 这个值。

因此,当您读取单词中的行时工作正常,但当您从文件中读取 class 的连续记录时,此方法将失败。 考虑

clas abc
{}a;

Fstream fin("file");


While(!fin.eof())


{
  fin.read((char*)&a,sizeof(a));


  a.display();  // display is a member function which displays the info }

从而显示最后一条记录两次。这是因为文件结束字符是最后一条记录的最后一个字节之后的字符。当最后一个被读取时,文件指针位于 eof 字节但尚未读取。所以它会再次进入循环但是这次读取了eof char但是读取函数失败了。变量 a 中已有的值,即以前的记录将再次显示。

一个快速简便的解决方法对我有用,可以避免在使用 eof 时出现任何问题,即在第一次读取后检查它,而不是将其作为 while 循环本身的条件。像这样:

 while (true) // no conditions
 {
    filein >> string; // an example reading, could be any kind of file reading instruction

    if (filein.eof()) break; // break the while loop if eof was reached

    // the rest of the code
 }