我们可以将整个文件读成字符串:
std::ifstream ifs(path);
assert(ifs.good());
std::string text(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>())
此代码返回一个空字符串。如何检查阅读过程中没有错误?
UPD:
我了解到,如果正在写入文件(或刚刚被覆盖),那么当我读取文件时,std :: filesystem :: file_size可能返回0,并且ifstream从操作符bool返回true(在Windows上) )。因此,该文件在一段时间内不可用,但是我没有出现任何错误,并且无法将这种情况与真正的空文件情况区分开。因此,我必须在文件大小为0的情况下循环读取文件一段时间。
答案 0 :(得分:1)
检查流是否有错误的最简单方法是在对流执行每次操作后使用operator bool。
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::string file_name{"data.txt"};
std::ifstream ifs(file_name);
if ( !ifs) // <---
std::cout << "Error: unable to open " << file_name << ".\n";
std::string text{ std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>() };
// ^ ^
if ( ifs ) // <--
std::cout << text << '\n';
else
std::cout << "An error occured while reading the file.\n";
}
请注意,OP的代码段受Most Vexing Parse的困扰,可以使用字符串的list-initialization对其进行修复。