最近、バイナリ ファイル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>
ます。
完全に簡単に見える最後のオプションは、を使用することです。これは、「入力ファイルストリームが必要で、それを使用してsを読み取りたい」という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
ますか?
(私が見ることができる唯一の利点は単純さです)