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
übernommenAusführen von Mac OS X und Kompilieren mit XCode.
Gibt die Größe der Datei zurück. Die Größe Ihrer image.png
ist 1944 bytes
.
cout << "size: " << fileSize << endl;
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;
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;
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:
Wenn Sie dies nicht tun, erstellen Sie am Ende ein Speicherleck .
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. 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% Was erwartest du? Png-Dateien sind binär, so dass sie '
-Zeichen (Zeichen mit dem numerischen Wert 0) irgendwo enthalten können. '
''
' terminated array of charactersfileContents
'
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%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.