- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们可以将整个文件读入一个字符串:
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/
我想在一个文本文件中查找行数,但是在执行istreambuf_iterator 后我无法读取内容。 std::ifstream loadfile("file.txt"); line_count = s
基于这个问题:C++ streams confusion: istreambuf_iterator vs istream_iterator?在 istreambuf_iterator ,我的理解是is
istreambuf_iterator 什么时候抛出异常?当底层流试图读取一个目录时,我收到一个异常,但在其他情况下没有。具体来说,我从 Jan-Philip Gehrcke 的 blog 中获取了脚
在标准中我读到你必须创建一个默认迭代器才能知道迭代器是否已经到达流的末尾。我认为它变得非常丑陋,难道没有任何预定义的符号或等效符号可以帮助我们吗? The default-constructed st
我们可以将整个文件读入一个字符串: std::ifstream ifs(path); assert(ifs.good()); std::string text(std::istreambuf_iter
我正在使用以下代码(使用命名空间 std)将文件内容转换为字符串。 代码 1 string fileToString(const string& filename) { ifstream fi
我有一段代码可以将 .txt 文件的内容读入字符串。 std::ifstream file("address.txt"); std::string oldAddress((std::istreamb
我正在阅读 Constructing a vector with istream_iterators这是关于将完整的文件内容读入字符 vector 。虽然我希望将文件的一部分加载到字符 vector
代码如下: #include #include #include #include std::vector bytes; { std::ifstream in(name, std::i
我尝试将二进制文件内容的一部分读入字符串。为什么是字符串?我的消息协议(protocol)(使用 protobuf)需要这个。 下面的效果很好: std::string* data = new std
以下是an example from cppreference.com , The Code is: #include #include #include #include int main(
istreambuf_iterator 和 istream_iterator 有什么区别。 对于下面的代码: istream_iterator cin_in(cin); istream_itera
我已经使用 从流中一个一个地提取字符,以构造对象。 最终,我的目标是能够使用 istream_iterator 遍历流并将每个对象插入 vector .非常标准,除了我无法获得 istream_ite
istreambuf_iterator 和 istream_iterator 有什么区别?一般来说,流和流缓冲区有什么区别?我真的找不到任何明确的解释,所以决定在这里问。 最佳答案 IOstreams
许多程序员可能会混淆以下代码: int main() { std::ifstream ifs("filename", std::ios::binary); std::string conten
我需要读取一个包含标题和数据的二进制文件(一次性)。在 C++ 中有多种读取文件的方法,我想知道哪种方法最快、更可靠。我也不知道 reintrerpret_cast 是否是将原始数据转换为结构的最佳方
我正在尝试读取一个充满 std::complex 的二进制文件.我尝试了以下代码,as suggested in this SO answer : #include #include #inclu
我无法编译(非常做作)C++ ranges example : #include #include #include template auto populate(R&& range) {
我有以下代码: std::ifstream ifs(fileName, std::ios_base::in | std::ios_base::binary); std::vector vecdata(
我将二进制文件读入 uchar vector ,如下所示: std::ifstream is("path", std::ios::in | std::ios::binary); std::vector
我是一名优秀的程序员,十分优秀!