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 是 true
或 false
值,具体取决于文件结尾 (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
}
有人告诉我在读取文件时应该使用 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 是 true
或 false
值,具体取决于文件结尾 (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
}