使用std :: ifstream,std :: istream_iterator和std :: copy不会读取整个文件

Ror*_*art 5 c++ stl

我有以下代码,我一直在188字节文件上使用:

std::ifstream is("filename", std::ios::binary);

std::vector<uint8_t> buffer;
std::istream_iterator<uint8_t> i_input(is);
std::copy(i_input, std::istream_iterator<uint8_t>(),
          std::back_inserter(buffer));

std::cout << buffer.size();
Run Code Online (Sandbox Code Playgroud)

但是它只读取188个字节的186个字节.

我已经使用hexeditor确认了文件大小ls -al.

Tim*_*imo 11

我不知道为什么,但默认情况下似乎跳过空白.你需要禁用它noskipws:

is >> std::noskipws;
Run Code Online (Sandbox Code Playgroud)

  • @JoachimPileborg:这与二进制模式无关.你正在使用*格式化的提取*,它可以进行各种修改和跳过.可以说,格式化提取到`char`必须是在原始文件中读取的最差方式! (2认同)

Ass*_*vie 9

最后两个字节是什么?此外,您并不需要istream_iterator像这样读取二进制数据.这太过分了,可能比使用慢streambuf.

wilhelmtell的伟大答案中看到这个例子:

#include<iterator>
// ...

std::ifstream testFile("testfile", std::ios::in | std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
                               std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)