Binärdatei c ++ lesen

8

Ich versuche ein Bild in ein Char-Array zu lesen. Hier ist mein Versuch:

%Vor%

Und das ist die Ausgabe:

%Vor%

Kann mir das jemand erklären? Gibt es ein Dateiende-Zeichen an Position 8? Dieses Beispiel wurde von cplusplus.com

übernommen

Ausführen von Mac OS X und Kompilieren mit XCode.

    
Emil 28.05.2011, 15:33
quelle

5 Antworten

10
  1. Gibt die Größe der Datei zurück. Die Größe Ihrer image.png ist 1944 bytes .

    cout << "size: " << fileSize << endl;

  2. Gibt sizeof(char*) zurück, also 8 für Ihre Umgebung. Beachten Sie, dass die Größe eines beliebigen Zeigers in jeder Umgebung immer gleich ist.

    cout << "sizeof: " << sizeof(fileContents) << endl;

  3. Die Datei, die Sie lesen, ist eine Binärdatei, daher könnte sie 0 als gültige Daten enthalten. Wenn Sie strlen verwenden, wird die Länge zurückgegeben, bis ein 0 auftritt, was im Falle Ihrer Datei 8 ist.

    cout << "length: " << strlen(fileContents) << endl;

  4. Gibt das Zeichen am 56th location (die Indexierung des Arrays beginnt bei 0 an) vom Dateianfang zurück.

    cout << "random: " << fileContents[55] << endl;

Ein Vorschlag:

Denken Sie daran, die dynamische Speicherzuweisung für fileContents mit:

aufzuheben %Vor%

Wenn Sie dies nicht tun, erstellen Sie am Ende ein Speicherleck .

    
Alok Save 28.05.2011, 15:45
quelle
3

Diese Antwort von mir auf eine andere Frage sollte sein genau das, wonach du suchst (besonders den zweiten Teil über das Lesen in ein vector<char> , was du einem Array vorziehen solltest.

Wie für Ihre Ausgabe:

  • sizeof(fileContents) gibt die Größe eines char * zurück, was 8 auf Ihrem System ist (64 Bit, denke ich)
  • strlen stoppt beim ersten '%code%' , genau wie der Ausgabeoperator.
Björn Pollex 28.05.2011 15:35
quelle
3

fileSize - die Anzahl der Bytes in der Datei.

sizeof (fileContents) - gibt die Größe eines char * -Zeigers zurück.

strlen (fileContents) - zählt die Anzahl der Zeichen, bis ein Zeichen mit dem Wert '0' gefunden wird. Das ist anscheinend nach nur 8 Zeichen - seit Sie BINARY Daten lesen, ist dies kein unerwartetes Ergebnis.

cout & lt; & lt; fileContents - wie strlen schreibt cout Zeichen, bis eine mit dem Wert '0' gefunden wird. Von der Ausgabe sieht es so aus, als ob einige Zeichen nicht druckbar sind.

Ihr Beispiel hat einige andere Probleme - es wird beispielsweise nicht der verwendete Speicher freigegeben. Hier ist eine etwas robustere Version:

%Vor%     
Geoffrey Elliott 28.05.2011 16:01
quelle
2

Was erwartest du? Png-Dateien sind binär, so dass sie '''fileContents'' terminated array of characters' -Zeichen (Zeichen mit dem numerischen Wert 0) irgendwo enthalten können.

Wenn Sie den Inhalt der PNG-Datei als Zeichenfolge behandeln ( %code% ) und als Zeichenfolge ausgeben, wird sie nach dem ersten %code% -Zeichen unterbrochen.

Es ist also nichts falsch mit dem Code, %code% enthält korrekt die PNG-Datei (mit 1944 Bytes)

%Vor%     
dragon135 28.05.2011 15:54
quelle
0

Es empfiehlt sich, vorzeichenloses Zeichen zur Verwendung mit Binärdaten zu verwenden. Das zufällig ausgewählte Zeichen wird möglicherweise aufgrund der Beschränkungen der unterstützten Schriftarten im Konsolenfenster nicht richtig angezeigt. Sie können dasselbe auch überprüfen, indem Sie es in hexadezimalem Format drucken und die gleiche Datei in einem Hex-Editor öffnen, um es zu überprüfen. Bitte vergessen Sie nicht, den nach der Verwendung zugewiesenen Speicher zu löschen.

    
sarat 28.05.2011 16:11
quelle

Tags und Links