2012-04-02 4 views
0

Ich benutze fread() in C++, um sehr große Binärdateien (100MB-2GB) zu lesen. Die Binärdateien werden ursprünglich aus C++ geschrieben, indem eine Reihe von "Paketen" ausgegeben wird. Die Pakete bestehen aus einer "Header" -Struktur (die ein Größenfeld enthält), die direkt in eine Datei geschrieben wird, und dann binärem Inhalt mit einer Größe, die gleich der Größe ist, die in den Header geschrieben wird. Beim Lesen der Dateien werden die Pakete durchgeschleift, der Header wird in eine Struktur eingelesen und der Inhalt wird in einen Leerzeiger der in der Kopfzeile angegebenen Größe eingelesen.C++: fread() gibt nicht Null zurück, fügt aber nur Nullen in den Puffer ein

Dies ist eine bekannte Arbeitsmethode, die bereits in anderen Tools implementiert ist (was bedeutet, dass ich die Dateien validieren kann, die ich zu lesen versuche). Angenommen, alle Dateien, mit denen wir arbeiten, werden überprüft. In mindestens einer Datei funktioniert meine Implementierung des Lesens einer Binärdatei ordnungsgemäß.

Mit einer anderen Datei fängt fread() jedoch an, ohne erkennbaren Grund funky zu wirken. Nach vielen erfolgreichen liest, las ich sauber den Kopfteil eines Pakets mit:

if (sizeof(stHdr) != fread((void *)&stHdr, 1, sizeof(stHdr), fi)) 

Durch sauber liest, ich meine fread() gibt „sizeof (stHdr)“ wie erwartet, und feof (fi) und ferror (fi) beide geben 0 zurück. Jedoch ... stHdr ist vollständig mit allen Nullen gefüllt; Der Wert jedes Feldes in stHdr enthält 0x0. Ich habe die Binärdatei validiert, um korrekt gebildet zu werden, und Daten an dem Punkt zu haben, den ich gerade lese.

Hat jemand das schon einmal gesehen oder weiß, was es verursachen könnte?

Danke!

+0

Wenn ich das gesehen habe, wäre mein erster Gedanke, dass ich die falsche Datei geöffnet habe. –

+0

Lesen Sie in einen Puffer statt einer Struktur und sehen Sie, ob Sie immer noch alle Nullen erhalten. struct's sind nicht genau das, was sie früher mit C waren ... obwohl es * als * POD (einfache alte Daten) behandelt werden sollte, gibt es eine Reihe von Gründen dafür, es als Klasse zu behandeln und die Daten, auf die es zeigt, zu überschreiben möglicherweise kontraproduktiv sein –

Antwort

0

Das Problem endete ein klassischer Fall von PEBKAC sein ...

Anscheinend meine Binärdatei tat irgendwann beschädigt und haben tatsächlich ein paar haben 0s drin. Ich hatte es direkt aus einem Repository kopiert und die Datei wurde validiert, bevor sie in den Repo eingegeben wurde, also nahm ich an, dass es gut war. Anscheinend ist mit meiner lokalen Version der Datei etwas Schlimmes passiert und war die Quelle meiner Probleme.

+0

'Wenn ich das gesehen hätte, wäre mein erster Gedanke, dass ich die falsche Datei geöffnet habe' - ich bin gut darin :)) –

0

Wenn Ihre Dateien mehr als 2 GB groß sind, müssen Sie die Unterstützung großer Dateien aktivieren.

Die schnelle und einfache Möglichkeit, dies zu tun, ist mit -D_FILE_OFFSET_BITS=64 kompilieren. Für die gezieltere Möglichkeiten und weitere Details finden Sie http://www.suse.de/~aj/linux_lfs.html

+0

Ich kann die Antwort noch nicht posten, aber das Problem endete, dass ich tatsächlich mit einer beschädigten Datei arbeitete ... Dies ist jedoch sehr guter Rat, und da ich tatsächlich mit Dateien arbeiten kann, dass brauche LFS in der Zukunft, werde ich von nun an dafür sorgen, dass ich es kompiliere. – creynia