In letzter Zeit wurde ich gebeten, eine Funktion zu schreiben, die die Binärdatei in das std::vector<BYTE>
wo BYTE
ist ein liest unsigned char
. Ganz schnell kam ich mit so etwas:
#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;
}
Das scheint unnötig kompliziert zu sein, und die explizite Besetzung, char*
die ich beim Telefonieren file.read
verwenden musste, lässt mich nicht besser fühlen.
Eine andere Option ist 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>());
}
Das ist ziemlich einfach und kurz, aber ich muss es trotzdem benutzen, std::istreambuf_iterator<char>
auch wenn ich hineinlese std::vector<unsigned char>
.
Die letzte Option, die vollkommen unkompliziert zu sein scheint, ist die Verwendung std::basic_ifstream<BYTE>
, die es ausdrücklich ausdrückt: "Ich möchte einen Eingabedateistream und ich möchte ihn zum Lesen von BYTE
s verwenden" :
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>());
}
Ich bin mir aber nicht sicher, ob basic_ifstream
dies in diesem Fall eine angemessene Wahl ist.
Was ist der beste Weg, um eine Binärdatei in die zu lesen vector
? Ich würde auch gerne wissen, was "hinter den Kulissen" passiert und auf welche möglichen Probleme ich stoßen könnte (abgesehen davon, dass der Stream nicht richtig geöffnet wird, was durch einfache is_open
Überprüfung vermieden werden könnte ).
Gibt es einen guten Grund, warum man es vorziehen würde, std::istreambuf_iterator
hier zu verwenden ?
(Der einzige Vorteil, den ich sehen kann, ist die Einfachheit)