最近我一直在问编写一个函数读取二进制文件到std::vector<BYTE>
哪里BYTE
是unsigned char
。我很快就想到了这样的东西:
#include <fstream>
#include <vector>
typedef unsigned char BYTE;
std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::streampos fileSize;
std::ifstream file(filename, std::ios::binary);
// get its size:
file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// read the data:
std::vector<BYTE> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
}
这似乎不必要地复杂,并且char*
在调用时被迫使用的显式强制转换file.read
不会使我对此有所改善。
另一种选择是使用std::istreambuf_iterator
:
std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::ifstream file(filename, std::ios::binary);
// read the data:
return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
}
这非常简单且简短,但是std::istreambuf_iterator<char>
当我读入时,我仍然必须使用甚至std::vector<unsigned char>
。
似乎非常简单明了的最后一个选项是use std::basic_ifstream<BYTE>
,它明确表示“我想要输入文件流,并且想要使用它读取BYTE
s”:
std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::basic_ifstream<BYTE> file(filename, std::ios::binary);
// read the data:
return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
std::istreambuf_iterator<BYTE>());
}
但我不确定basic_ifstream
在这种情况下是否合适的选择。
将二进制文件读入的最佳方法是vector
什么?我还想知道“幕后”正在发生什么,以及我可能遇到的可能的问题(除了无法正确打开流,可以通过简单的is_open
检查来避免此问题)。
有什么充分的理由为什么人们更喜欢在std::istreambuf_iterator
这里使用?
(我看到的唯一优点是简单)