【问题标题】:Read file into std::vector<std::byte>将文件读入 std::vector<std::byte>
【发布时间】:2018-02-24 16:22:07
【问题描述】:

我正在尝试将二进制格式的文件读入std::vector&lt;std::byte&gt;

  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)),

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

谢谢!

【问题讨论】:

  • @PasserBy 如果我尝试使用istream_iterator 如果得到error: no match for ‘operator&gt;&gt;’ (operand types are ‘std::istream_iterator&lt;std::byte&gt;::istream_type {aka std::basic_istream&lt;char&gt;}’ and ‘std::byte’)
  • @ThéoChampion 这是因为没有默认的operator&gt;&gt;std::istream 读取std::byte

标签: c++ c++17


【解决方案1】:

你应该可以这样做:

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

  std::vector<std::byte> file_content{ std::istreambuf_iterator<std::byte>(fStream), {} };

【讨论】:

  • 你上面提到的不起作用。在抛出 'std::bad_cast' what() 的实例后调用终止:std::bad_cast
【解决方案2】:

不幸的是,STL 中只实现了 char 迭代器,所以

std::istreambuf_iterator<std::byte>

会导致错误。所以使用

std::istreambuf_iterator<char>

改为。

【讨论】:

    【解决方案3】:

    我正在尝试将二进制格式的文件读入std::vector&lt;std::byte&gt;

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

    如果您想使用std::istring_iterator 读取字节,您需要定义一个自定义operator&gt;&gt; 调用std::istream::read()std::stream::get()。但这将是低效的,因为它一次读取 1 个字节。最好直接调用read()一次读取多个字节的块。例如,查询文件大小,将std::vector 预分配到该大小,然后将read()std::ifstream 直接分配到该大小的std::vector

    更新:我刚刚注意到您使用的是std::istreambuf_iterator 而不是std::istream_iteratorstd::istreambuf_iterator 不使用operator&gt;&gt;,因此它更适合读取字节。但是,它仍然一次读取 1 个字节,所以我所说的使用 std::istream::read() 一次读取多个字节仍然适用。

    【讨论】:

    • 如果我理解得很好,您的意思是 godbolt.org/g/ezWhp2,但如果我使用 std::byte 而不是 char,这将不起作用,对吧?
    • @ThéoChampion 是的,类似的东西,是的,它适用于std::byte,例如:file.read((char*)buffer.data(), length);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多