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

问题描述:

有人告诉我在阅读文件时应该使用while(fin)而不是while(!fin.eof())Turbo C++:while(fin)vs while(!fin.eof())

究竟是什么区别?

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

哪一个是正确的做法?

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

+7

不是答案,而是男人,turbo C++是旧的... – HolyBlackCat

+0

比较读取文件时发生错误时的两个选择。 – CodesInChaos

+0

@CodesInChaos我在找一些理论上的解释。我当然可以检查fin和fin.eof()。事实证明,fin还会检查失败标志以及eof标志,但我不明白它是如何工作的。 –

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

让我解释一下。 eof()fstream类的成员,该类返回truefalse值,具体取决于是否已达到正在阅读的文件的文件结尾(eof)。因此虽然eof()函数返回0这意味着文件末尾还没有到达并且循环继续执行,但是当eof()返回1时文件已到达并且循环结束。

while(fin)循环被输入,因为fin实际上返回类对象fin中的错误标志变量的值,当任何函数如读或写或打开失败时,其值被设置为0。因此,只要循环内的读取函数有效,循环就会工作。

我个人不会建议他们中的任何一个。 我建议

//假定一个类abc。

abc ob; 


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

或者

While(fin.getline(parameters)) 
{} 

这个循环读取循环条件里面的文件记录,如果没有是由于文件的末尾被读取达到退出循环。

while(!fin.eof())的问题在于,如果已达到文件末尾,它将返回1。文件结尾实际上是一个放在文件末尾的字符。所以当循环内部的读取函数读取这个字符并将一个变量eof设置为1.所有函数实际上都会返回这个值。

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

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中的值,即以前的记录将再次显示。

一个很好的方法是做这样的事情:

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; 
}