我如何知道指定的文件是否已被正确读取?

时间:2013-01-20 23:52:22

标签: c++ fstream ifstream

为什么ifstream在读取指定文件的最后一行后将failbit设置为1?我如何知道指定的文件是否已被正确读取?

bool read_csv_file(const char* filename, vector<string>& lines, bool adding = false)
{
    if( !adding ) lines.clear();

    ifstream csvfile;
    csvfile.open(filename);

    if( csvfile.is_open() )
    {
        string line;
        while( csvfile.good() && getline(csvfile,line) )
        {
            lines.push_back(line);
            cout << "fail: " << csvfile.fail() << endl;
        }
        cout << "fail: " << csvfile.fail() << endl;
        csvfile.close();
        return (!csvfile.fail());
    }

    return false;
}

3 个答案:

答案 0 :(得分:2)

在运行文件末尾后设置失败位。一旦发生这种情况,您不得尝试解释输入操作的结果。但这完全没问题,getline将无法设置失败位,同时还有要读取的任何数据。所以以下标准循环extracts all the lines

for (std::string line; std::getline(csvfile, line); )
{
    // process "line"
}

// all done

答案 1 :(得分:1)

要检查错误的读取,您必须使用badbit测试stream.bad()

Failbit表示操作逻辑失败,显然getline在达到EOF时设置了它(在我的机器上确认)。

答案 2 :(得分:1)

在阅读完最后一个failbit之后可以设置的唯一原因 line(或任何行)是否在库中有错误,并且 我真的不相信。如果设置了failbit,则意味着 你没有读什么。在您的情况下,它永远不会被设置 当你在循环中;如果已设置,getline会有 评估为false,你就不会进入循环。 当然,循环正好因为getline而终止 失败(或失败 - 通常,你测试 在做输入之前good,如果你这样做,请考虑一下 如果测试失败,则设置failbit

这类事情的通常模式是:

while ( someInput ) {
    //  ...
}
if ( csvfile.bad() ) {
    //  Serious error (disk read error, etc.)...
} else if ( ! csvfile.eof() ) {
    //  Formatting error...
} else {
    //  Normal end of file...
}

然而,当someInputstd::getline()时,您永远不会 由于格式错误而失败,因此上面的else if会 从来都不是真的(而且很多代码都像硬盘一样对待硬盘错误 它们是文件的结尾,因此也忽略了if部分。