将文件读入std :: vector <std :: byte>

Thé*_*ion 4 c++ c++17

我正在尝试将二进制格式的文件读入 std::vector<std::byte>

  std::ifstream fStream(fName, std::ios::binary);

  std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),
                                        std::istreambuf_iterator<std::byte>());
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误(对我来说看起来像是istreambuf_iterator缺少重载std::byte)

error: no matching function for call to ‘std::istreambuf_iterator<std::byte>::istreambuf_iterator(std::ifstream&)’
     std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么 ?如果是的话,最好的方法是什么?

谢谢!

Rem*_*eau 5

我正在尝试将二进制格式的文件读入 std::vector<std::byte>

您正在使用std::istream_iterator,它从std::istream使用中读取,默认情况下operator>>执行格式化读取而不是二进制读取.使用std::istream::read()读取二进制数据.

如果要用于std::istring_iterator读取字节,则需要定义operator>>调用std::istream::read()或的自定义std::stream::get().但这样效率很低,因为它一次读取1个字节.最好read()直接调用一次读取多个字节的块.例如,查询文件的大小,预分配std::vector到大小,然后read()std::ifstream直接进入std::vector该尺寸.

更新:我刚注意到你正在使用std::istreambuf_iterator而不是std::istream_iterator.std::istreambuf_iterator不使用operator>>,所以它更适合读取字节.但是,它仍然一次读取1个字节,所以我所说std::istream::read()的一次读取多个字节仍然适用.


小智 5

你应该可以这样做:

  std::basic_ifstream<std::byte> fStream{fName, std::ios::binary};

  std::vector<std::byte> file_content{ std::istreambuf_iterator<std::byte>(fStream), {} };
Run Code Online (Sandbox Code Playgroud)

  • 您上面提到的不起作用。抛出 'std::bad_cast' 实例后终止调用 What(): std::bad_cast (2认同)