我如何知道指定的文件是否被正确读取?
How do I know if the specified file has been read correctly?
为什么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...
}
当someInput
是std::getline()
时,你将永远不会由于格式化错误而失败,因此上面的else if
将失败绝对不是真的(而且很多代码将硬盘错误视为它们是文件的结尾,因此也忽略了if
部分)。
为了检查错误读取,必须使用stream.bad()
来测试badbit
。
Failbit
表示操作逻辑失败,显然getline
在达到EOF(在我的机器上确认)时设置它。
相关文章:
- 原子读取是否保证读取最新值
- 静态 constexpr 类成员变量对多线程读取是否安全?
- LMDB 是否支持随机读取?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- C++编译器是否优化了顺序静态变量读取?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 从popen()读取的输出是否在pclose()之前完成
- 键入特征以检查类型是否可从流和 MSVC 读取
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 如果由不同的线程写入 8 字节,那么现代英特尔 x86 上的 8 字节读取是否保证理智?
- 直接读取 pthread 互斥锁的所有者字段是否安全?
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- 是否可以使用 Webassembly 从磁盘读取文件?
- QTcpSocket 或 QSslSocket 是否会自动创建用于读取/写入的线程?
- 从文本文件读取时,如何知道是否已到达新行?
- 这个针对单个写入器 + 读取器的发布/检查更新类是否可以使用 memory_order_relaxed 或获取/发布以提
- 当结构数组在主线程中填充数据时,从结构数组的低索引元素读取是否线程安全
- 从std::cin非阻塞读取是否与std::this_thread::sleep_for()或std::this_thr
- 易失性但不受限制的读取是否会无限期地产生过时的值?(在真正的硬件上)