为什么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;
}
答案 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...
}
然而,当someInput
为std::getline()
时,您永远不会
由于格式错误而失败,因此上面的else if
会
从来都不是真的(而且很多代码都像硬盘一样对待硬盘错误
它们是文件的结尾,因此也忽略了if
部分。