In letzter Zeit wurde ich gebeten, eine Funktion zu schreiben, die die Binärdatei in das std::vector<BYTE>wo BYTEist 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.readverwenden 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 BYTEs 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_ifstreamdies 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_iteratorhier zu verwenden ?
(Der einzige Vorteil, den ich sehen kann, ist die Einfachheit)