fstream作为bool和fstream.good()函数的行为

时间:2014-09-22 00:11:05

标签: c++ while-loop ifstream

我最近使用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循环但是如何使用流名称呢?

2 个答案:

答案 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转换作为循环条件。