In letzter Zeit zu lesen, habe ich gebeten worden, eine Funktion zu schreiben, die die Binärdatei in die std::vector<BYTE>
liest, wo BYTE
ein unsigned char
ist. Ganz schnell kam ich mit so etwas wie diesem:Wie eine binäre Datei in einen Vektor von unsigned chars
#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;
}
, die unnötig kompliziert und der expliziten Umwandlung zu char*
zu sein scheint, dass ich gezwungen war, während die Verwendung file.read
rufe mich nicht um es besser fühlen.
Eine weitere Option ist std::istreambuf_iterator
zu verwenden:
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 ist, aber noch muss ich auch die std::istreambuf_iterator<char>
verwenden, wenn ich in std::vector<unsigned char>
bin zu lesen.
Die letzte Option, die perfekt einfach zu sein scheint, ist std::basic_ifstream<BYTE>
, zu verwenden, die es irgendwie explizit zum Ausdruck, dass „Ich habe eine Eingabedatei Stream will, und ich will, es benutzen BYTE
s zu lesen“:
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>());
}
aber ich bin mir nicht sicher, ob basic_ifstream
eine geeignete Wahl in diesem Fall ist.
Was ist der beste Weg zum Lesen einer Binärdatei in die vector
? Ich würde auch gerne wissen, was passiert "hinter der Szene" und was sind die möglichen Probleme, die ich (abgesehen von Strom nicht richtig geöffnet werden könnte, die durch einfache Überprüfung vermieden werden könnte).
Gibt es einen guten Grund, warum man hier lieber std::istreambuf_iterator
verwenden möchte?
(der einzige Vorteil, dass ich sehen kann, ist die Einfachheit)
@ R.MartinhoFernandes: Was ich damit meinte war, dass die dritte Option nicht besser als die zweite Option zu sein scheint. – LihO
jemand hat es gemessen (in 2011), mindestens in String geladen. http://insanecoding.blogspot.hk/2011/11/how-to-read-in-file-in-c.html – jiggunjer
Ein sicherer Weg, um die Größe zu finden: Verwenden Sie die spezielle ['ignore()'] (http : //en.cppreference.com/w/cpp/io/basic_istream/ignore) zähle: 'file.ignore (std :: numeric_limits :: max());', und gib die 'std :: streamsize "extrahiert" mit 'auto size =' ['file.gcount();'] (http://en.cppreference.com/w/cpp/io/basic_istream/gcount) –