Read binary-Datei c++
Ich versuche zu Lesen, ein Bild in ein char-array. Hier ist mein Versuch:
ifstream file ("htdocs/image.png", ios::in | ios::binary | ios::ate);
ifstream::pos_type fileSize;
char* fileContents;
if(file.is_open())
{
fileSize = file.tellg();
fileContents = new char[fileSize];
file.seekg(0, ios::beg);
if(!file.read(fileContents, fileSize))
{
cout << "fail to read" << endl;
}
file.close();
cout << "size: " << fileSize << endl;
cout << "sizeof: " << sizeof(fileContents) << endl;
cout << "length: " << strlen(fileContents) << endl;
cout << "random: " << fileContents[55] << endl;
cout << fileContents << endl;
}
- Und das ist die Ausgabe:
size: 1944
sizeof: 8
length: 8
random: ?
?PNG
Kann jemand erklären mir das an? Ist es eine end-of-file char an position 8? Dieses Beispiel wurde entnommen aus cplusplus.com
Mac OS X und kompiliert mit XCode.
- mögliche Duplikate von C++ - Lesen und schreiben von Binär-Datei
- Nein, es ist nicht eine doppelte, das problem der OP ist, die Verkleidung ist anders, nicht wirklich ein problem im source-code(abgesehen von undichten Speicher), aber in Verständnis es.
- Sie wollte nicht geben Sie an, welche Ausgabe du erwartet statt.
- Ich erwartete eine von sizeof oder length zu werden, 1944, aber wenn man die Kommentare unten sehe ich nun, dass es nicht eine Ausgabe, die ich bekommen kann
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt die Größe der Datei. Größe der
image.png
ist1944 bytes
.cout << "size: " << fileSize << endl;
Gibt die
sizeof(char*)
, die8
auf Ihre Umgebung. Beachten Sie, dass die Größe der Zeiger ist immer das gleiche auf jeder Umgebung.cout << "sizeof: " << sizeof(fileContents) << endl;
Die Datei, die Sie Lesen, ist eine binäre Datei, so dass es enthalten sein könnte
0
als gültige Daten. Wenn Siestrlen
es gibt die Länge, bis ein0
angetroffen wird, die im Fall der Datei ist8
.cout << "length: " << strlen(fileContents) << endl;
Gibt das Zeichen an der
56th location
(Sie erinnern sich die Indizierung von Arrays beginnt bei 0) von Beginn der Datei.cout << "random: " << fileContents[55] << endl;
Einen Vorschlag:
Erinnern Sie sich an deallocate die dynamische Zuweisung von Speicher für
fileContents
mit:wenn Sie das nicht tun, werden Sie am Ende die Schaffung eines Speicherverlust.
Diese Antwort von mir zu einer weiteren Frage sollte genau das sein was du suchst (vor allem der zweite Teil über das Lesen in einer
vector<char>
, die sollten Sie lieber zu einem array.Als für die Ausgabe:
sizeof(fileContents)
Rückgabe der Größe eineschar *
8 auf Ihrem system (64 bit denke ich)strlen
hält an der ersten'\0'
nur als Ausgabe-operator tut.fileSize - die Anzahl der bytes in der Datei.
sizeof( fileContents ) - gibt die Größe eines char* - Zeiger.
strlen( fileContents) - zählt die Anzahl von Zeichen, bis ein Zeichen mit dem Wert '0' gefunden wird. Das ist offenbar nach nur 8-Zeichen -, da Sie das Lesen von BINÄREN Daten, ist dies kein unerwartetes Ergebnis.
cout << fileContents - wie strlen, count schreibt Zeichen bis zu einem Wert von '0' zu finden ist. Aus der Ausgabe sieht es aus wie einige der Charaktere sind nicht druckbare.
Dein Beispiel hat auch einige andere Probleme - es nicht den Speicher frei verwendet, zum Beispiel. Hier ist eine etwas stabilere version:
Was erwarten Sie? png-Dateien sind Binär, so dass Sie kann enthalten
'\0'
Zeichen (Zeichen mit numerischen Wert 0) irgendwo.Behandeln, wenn Sie die png-Datei-Inhalt als string (
'\0' terminated array of characters
) und drucken Sie es als string, dann wird es halt nach der Begegnung mit dem ersten'\0'
Charakter.Also es ist nichts falsch mit dem code
fileContents
ist korrekt enthält die png-Datei (mit einer Größe von 1944 bytes)Es ist eine gute übung, benutzen Sie unsigned char zu verwenden mit binären Daten.
Den Charakter nach dem Zufallsprinzip ausgewählt werden, werden möglicherweise nicht richtig angezeigt in der Konsole-Fenster aufgrund der Einschränkungen in den Schriften unterstützt. Sie können auch überprüfen, die gleiche Sache, indem Sie ihn drucken, in hexadezimal und öffnen Sie die gleiche Datei in einem hex-editor, um es zu überprüfen. Bitte vergessen Sie nicht, löschen Sie den Speicher nach Gebrauch.