我最近使用fstream进行家庭作业,我想知道两件事是如何运作的。
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char** argv) {
ifstream myFile;
myFile.open("fileone.txt");
int myInt = 0;
while (myFile.good()) { // What is the difference between myFile and myFile.good()?
if (!myFile.eof()){
myFile >> myInt;
cout << myInt << endl;
}
}
return 0;
}
这是我正在处理的实际代码的片段。在另一篇文章中,有人说如果我使用while(myFile)
,它会自动转换为bool。使用它和使用.good()
类的成员函数ifstream
有什么区别?我知道当我到达文本文件的末尾时.good()
突然出现了while循环但是如何使用流名称呢?
答案 0 :(得分:2)
IOStream类有4个函数用于评估流状态:good()
,bad()
,fail()
和eof()
。排除good()
,每个函数检查基础流状态中的单个位,并返回该位是否打开(是否存在错误?)。 good()
特别检查所有位是否已关闭(流是否有效?)。这些是它们的用途:
good()
:流没有遇到错误。bad()
:流遇到了影响流完整性的错误(即内存分配失败,没有缓冲等)。fail()
:通常是可恢复的错误(格式化/解析失败)。eof()
:已达到文件结束(EOF
)字符。执行I / O时,在处理输入时检查流中的错误是不可或缺的。新手通常不知道的是,用于检查有效输入的 only 函数是fail()
。所有其他功能在其他情况下都很有用,但不适用于调节输入。
此外,新手也未能意识到必须在检查错误之前执行输入。否则允许进行未经检查的提取,允许循环体访问非有效提取产生的值。
Streams有一个返回!fail()
的布尔运算符,这允许您在执行输入后以优雅的方式检查流,如下所示:
while (myFile >> myInt) {
// ...
}
这是执行输入的最佳方式。提取本身应该存在于条件上下文中,这样只有在提取成功的情况下才能执行其所使用的任何主体。
答案 1 :(得分:1)
阅读manual。
定义了bool
转化,以便以下内容相同:
if (stream) { ... }
if (!stream.fail()) { ... }
stream.good()
和!stream.fail()
之间存在差异:!fail
也是文件末尾的true
。
您的代码还有一个重要问题:在使用输入之前,您应该检查读取是否成功。所以这真的很糟糕:
myFile >> myInt;
cout << myInt << endl
因为您尚未检查是否真的成功将int
读入myInt
。
<强> TLDR:强>
使用此功能从文件中读取int
:
while (myFile >> myInt) {
cout << myInt << endl;
}
原因:myFile >> myInt
返回myFile
,因此会调用bool
转换作为循环条件。