c++ - 使用 std::istream_iterator 从文件中读取二进制数据过早停止

标签 c++

我正在尝试使用以下代码从文件中读取二进制数据:

std::ifstream fp;
fp.open("C:\\my_binary_data.dat", std::ios::binary);
std::istream_iterator<byte> start(fp), end;
std::vector<byte> tof(start, end);
fp.close();

文件有 401 个字节,但 tof vector 只有 380 个元素长,即它在结束前停止读取。 end 设置为 nullptr(?),因此迭代器读取直到读取零字节?第380字节是109,这里的停止条件是什么?我如何确定它读取了整个文件?

使用

fp.seekg (0, fp.end);
std::streamoff length = fp.tellg();
fp.seekg (1, fp.beg);

给出长度=401

最佳答案

istream_iteratoroperator>>的化身;它使用该运算符从流中读取。这几乎不是您读取二进制数据所需要的,因为>> 是一个格式化 输入函数。您可能可以通过在流上使用诸如 noskipws 之类的操纵器来强制它执行您想要的操作,但它仍然会有效地使用错误的工具来完成工作。

如果您想要对流中的二进制数据进行基于迭代器的访问,您最好使用 istreambuf_iterator(保证逐个字符地工作)。

关于c++ - 使用 std::istream_iterator 从文件中读取二进制数据过早停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37588569/

相关文章:

c++ - LISP 解析器 C++

c++ - 从不传递 long long 作为参数?

用于移动应用程序开发的 C++ 跨平台框架

c++ - c1xx : fatal error C1083: Cannot open source file - with some Chinese or Javanese

c++覆盖数组类的>>运算符

c++ - 使用 std::move 返回 std::vector

c++ - 为什么在 C++ 中声明字符串时大小不同?

c++ - lua的表模拟

C++ 函数在不应该调用时被调用

c++ - 实现链接方法时打印出错误的值