C++ 使用std::istream_迭代器从文件中读取二进制数据会提前停止

C++ 使用std::istream_迭代器从文件中读取二进制数据会提前停止,c++,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的istream\u迭代器是操作员的化身;它使用该操作符从流中读取数据。这绝不是读取二

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

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的istream\u迭代器是操作员的化身;它使用该操作符从流中读取数据。这绝不是读取二进制数据所需要的,因为
>
是一个格式化的输入函数。您可能会通过在流上使用操纵器(如
noskipws
)来强制它做您想做的事情,但它仍然会有效地为工作使用错误的工具


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

istream_迭代器
操作符>
的化身;它使用该操作符从流中读取数据。这绝不是读取二进制数据所需要的,因为
>
是一个格式化的输入函数。您可能会通过在流上使用操纵器(如
noskipws
)来强制它做您想做的事情,但它仍然会有效地为工作使用错误的工具


如果您希望基于迭代器访问流中的二进制数据,最好使用
istreambuf\u迭代器
(保证可以逐个字符地工作)。

根据
std::istream\u迭代器
在读取之前跳过空白。您可能想要?这不是问题所在,但不是创建默认构造的文件对象然后打开它,而是在创建时打开它:
std::ifstream fp(“C:\\my\u binary\u data.dat”,std::ios::binary)@PeteBecker,所以如果使用默认构造函数,然后使用open,它的行为与openconstructor不同?这不是很令人困惑吗。这有记录吗?@PeteBecker,幸运的是,他做出了同样的行为。@thorsan-这不是运气。这就是它的工作原理。一般来说,与其创建某个内容然后分配给它,不如用它从分配中获得的值初始化它。根据
std::istream\u迭代器
在读取之前跳过空白。您可能想要?这不是问题所在,但不是创建默认构造的文件对象然后打开它,而是在创建时打开它:
std::ifstream fp(“C:\\my\u binary\u data.dat”,std::ios::binary)@PeteBecker,所以如果使用默认构造函数,然后使用open,它的行为与openconstructor不同?这不是很令人困惑吗。这有记录吗?@PeteBecker,幸运的是,他做出了同样的行为。@thorsan-这不是运气。这就是它的工作原理。一般来说,不是创建某个对象然后分配给它,而是用它从分配中获得的值初始化它。
fp.seekg (0, fp.end);
std::streamoff length = fp.tellg();
fp.seekg (1, fp.beg);