我试图将二进制格式的文件读入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)),
我做错了吗?如果是的话,最好的方法是什么?
谢谢!
答案 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>
相反。