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

时间:2018-02-24 16:22:08

标签: 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)),

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

谢谢!

3 个答案:

答案 0 :(得分:5)

  

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

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

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

更新:我刚刚注意到您使用的是std::istreambuf_iterator而不是operator>>std::istream::read()不使用 var emp = new Employee { Name = "Mike" }; var employees = new List<Employee>(); employees.Add(emp); var engine = new Engine(); engine.SetValue("employees", employees); // how to get the value "Mike" out of the engine? JsValue name = engine.Execute("employees[0].Name").GetCompletionValue(); System.Console.WriteLine(name.ToString());//This should return Mike ,因此它更适合读取字节。但是,它仍然一次读取1个字节,因此我所说的关于使用N一次读取多个字节的说法仍然适用。

答案 1 :(得分:0)

您应该可以这样做:

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

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

答案 2 :(得分:0)

不幸的是,在 STL 中仅实现了 char 迭代器,因此

std::istreambuf_iterator<std::byte>

将导致错误。所以用

std::istreambuf_iterator<char>

相反。