最近有人要求我编写一个函数,将二进制文件读入std::vector<BYTE>
where BYTE
is an 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>
.
最后一个似乎非常简单的选项是使用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
吗?
(我能看到的唯一优点是简单)