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

How do I know if the specified file has been read correctly?

本文关键字:读取 是否 文件 何知道      更新时间:2023-10-16

为什么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;
}

在运行完文件尾部后设置失败位。一旦发生这种情况,就不能试图解释输入操作的结果。这是非常好的,但是,getline将不会设置失败位,而仍然有任何数据要读取。因此,以下标准循环提取所有行:

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

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部分)。

为了检查错误读取,必须使用stream.bad()来测试badbit

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

相关文章: