fread Abschluss Mitte lesen bei Nullwerte. Auch in Müll Vergangenheit Lesen erwartete Daten

StackOverflow https://stackoverflow.com/questions/1541676

Frage

Ich bin in Stücke einer Binärdatei Lesen eines FILE-Objekt in C ++ verwenden. Hier ist die fseek und entsprechende fread Aufruf:

fseek(fp, startLocation, SEEK_SET);
fread(data, m_sizeOfData, 1, fp);
eine ganze Zahl von mehr als 400 Tausend

m_sizeOfData endet. Dies scheint, dass es all 400000 + Bytes aus der Binärdatei in Daten lesen soll (das ist ein Zeichen [m_sizeOfData], übrigens), aber es stoppt nach etwa 6 oder 7 Zeichen in einem Unicode-Zeichen, das einfach wie ein Kasten aussieht. Ich denke, es könnte eine Null-Terminierung darstellen? Ich bin auf diese nicht positiv. Dies ist nicht der Fall mit jedem Stück der Datei, in der ich zu lesen. Die meisten zur Arbeit erscheinen (in der Regel) nicht korrekt.

Warum dies sein könnte, und ist es eine Möglichkeit, richtig alle Daten lesen?

Bearbeiten :

fp wird als solche definiert:

FILE* fp;
_wfopen_s(&fp, L"C://somedata.dat", L"rb");

Dieses Feld Zeichen, in hex, ist 0x06 gefolgt von 0x00.
Die Daten werden definiert durch: char * data = new char [m_sizeOfData];

bearbeiten 2 :

Ich habe auch bemerkt, dass eine andere Datei einige Müll auf das Ende dieser geladen ist zu müssen. Der Müll aussieht wie:

  

YYYY «« «« «« «« Ith

Ist das, weil es versucht, eine bestimmte Runde Anzahl von Bytes zu vervollständigen?

War es hilfreich?

Lösung

Sie verwenden die Zähl- / Größenparameter von fread falsch herum. Da Sie Bytes lesen, sollte der zweite Parameter 1 und der dritte Parameter die Zählung sein:

fread(data, 1, m_sizeOfData, fp);

Sie können dann den Rückgabewert von fread verwenden, um zu bestimmen, wie viele Bytes gelesen wurden. Wenn Sie die erwartete Anzahl zurückgegeben werden immer, dann können Sie sicher sein, dass Sie alle die Daten lesen Sie wollten. In diesem Fall werden Sie wahrscheinlich die Ausgabe der Daten falsch - wenn Sie es als ein NUL-terminierten String behandeln, dann ist die 0x00 Sie sehen, wird das Ende sein, was gedruckt wird. Die 0x06 ist wahrscheinlich das Feld Glyphe.

Andere Tipps

Wie wissen Sie, es zu stoppen, wo Sie sagen? Wenn Sie nur auf dem Ergebnis mit String-Funktionen suchen, werden diese String-Funktionen halten alle in dem ersten Null-Zeichen -. Die tatsächlichen Daten könnten viel viel weiter verlängern

Wenn Sie auf Fenster sind, ich glaube, es gibt einige Zeichen, dass wie Strg-Z oder Strg-D, die das Ende der Datei bedeuten kann, wenn Sie speziell die Datei im Binärmodus öffnen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top