c++ - 将文件读入 std::vector<std::byte>

标签 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>());

但我收到此错误(对我来说这看起来像 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)),

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

谢谢!

最佳答案

I'm trying to read a file in binary format into a 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()直接一次读取多个字节的 block 。比如查询文件大小,预分配std::vector到那个尺寸,然后 read()来自 std::ifstream直接进入std::vector对于那个尺寸。

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

关于c++ - 将文件读入 std::vector<std::byte>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48964928/

相关文章:

c++ - 直接列表初始化的自动规则

c++ - 尝试实现 HeapSort

c++ - 通过赋值运算符返回字符数组

c++ - Visual Studio 2010 Express STL列表编译器错误

c++ - 有没有办法在 C++17 中折叠初始化列表

c++ - 从第一类型的第二个非类型参数推导第一类型

c++ - 关于与return语句一起发生的异常的问题

c++ - 如何在另一台电脑上玩 SFML 游戏

c# - 函数模板和委托(delegate)有什么区别?

c++ - 测试 std::byte 的可用性