最近我被要求写一个函数,将二进制文件读入到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;
}
这似乎过于复杂,而且在调用
file.read
时被迫使用显式转换为char*
,使我感到更加不满意。
另一个选择是使用 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::vector<unsigned char>
时,仍然需要使用std::istreambuf_iterator<char>
。
最后一个看起来非常简单的选项是使用
std::basic_ifstream<BYTE>
,它明确地表达了“我想要一个输入文件流,并且我想要使用它来读取BYTE
”: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
?
(我唯一能看到的优点是简洁性)
ignore()
计数:file.ignore(std::numeric_limits<std::streamsize>::max());
,然后使用auto size =
file.gcount();
返回提取的std::streamsize
。 - Brett Hale