最近我一直在问编写一个函数读取二进制文件到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>
。
这似乎是非常简单明了的最后一个选项是使用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
这里?
(我可以看到的唯一优点是简单)