最近我一直在问编写一个函数读取二进制文件到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>,它明确表示“我想要输入文件流,并且想要使用它读取BYTEs”:
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这里使用?
(我看到的唯一优点是简单)