gpt4 book ai didi

c++ - 从流和缓冲区填充 vector 时的不同结果

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:58 24 4
gpt4 key购买 nike

我有一个二进制文件,我正在将其加载到字节 vector 中,但根据我读取文件的方式,我意外地得到了不同的结果。我怀疑这与我使用istream_iterator有关,但我想更好地了解正在发生的事情。作为背景,加载的数据只是一个字节流。如果它重要的话,我认为它可能,最后的十几个字节是 0x00。

案例一

ifstream is("file.dat", ifstream::binary);
vector<uint8_t> v;
v.assign(istream_iterator<uint8_t>(is), istream_iterator<uint8_t>());

案例二

ifstream is("file.dat", ifstream::binary);
vector<uint8_t> v;
is.seekg(0, in.end);
int length = is.tellg();
is.seekg(0, in.beg);
char* buffer = new char[length];
is.read(buffer, length);
v.assign(buffer, buffer + length);

情况 1 导致较小的 vector 。两个 vector 中的初始数据相同,但在情况 1 中它被截断了。

最佳答案

Vlad 提供了代码#1 的改进版本,我将提供更好的代码#2:

basic_filebuf<uint8_t> ifb;
ifb.open("file.dat", ios_base::in | ios_base::binary);

vector<uint8_t> v;
v.resize(ifb.pubseekoff(0, ios_base::end));
ifb.pubseekpos(0);
ifb.sgetn(&v[0], v.size());

事实是,ifstream 并非用于处理未格式化的数据,即使使用 ios_base::binary 打开它也是如此。该标志有点名不副实——它禁用换行符转换,但不会导致插入和提取操作使用二进制编码。

这个版本应该快很多,不仅因为预分配 vector 时复制更少,而且因为 filebuf xsgetn 可以传输大块,而迭代器访问单个元素。即使有一个缓冲区用于在 I/O 级别进行大块传输,迭代器强加的每个字符的虚拟调用也会降低性能。

关于c++ - 从流和缓冲区填充 vector 时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117190/

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