gpt4 book ai didi

c++ - 检查 istreambuf_iterator 失败

转载 作者:行者123 更新时间:2023-11-28 04:02:19 36 4
gpt4 key购买 nike

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

std::ifstream ifs(path);
assert(ifs.good());
std::string text(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>())

一旦此代码返回一个空字符串。如何检查读取过程中没有错误?

更新:

我了解到,如果一个文件正在被写入(或刚刚被覆盖),那么当我读取该文件时,std::filesystem::file_size 可能返回 0,而 ifstream 从 operator bool 返回 true(在 Windows 上).所以该文件有一段时间不可用,但我没有收到任何错误,我无法将这种情况与真正的空文件情况区分开来。所以我必须在一段时间内循环读取文件大小为 0 的文件。

最佳答案

检查流是否有错误的最简单方法是使用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 修复的字符串。

关于c++ - 检查 istreambuf_iterator 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294651/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com