使用std :: istream_iterator从文件中读取二进制数据是prematuraly

时间:2016-06-02 09:58:59

标签: 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向量只有380个元素长,即它在结束前停止读取。 end设置为nullptr(?),因此迭代器读取直到它读取零字节?第380个字节是109.这里的停止条件是什么?我怎么能确定它读取整个文件?

使用

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

给出长度= 401

1 个答案:

答案 0 :(得分:3)

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

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