检查istreambuf_iterator失败

时间:2019-12-11 21:51:56

标签: c++

我们可以将整个文件读成字符串:

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的情况下循环读取文件一段时间。

1 个答案:

答案 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对其进行修复。