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!
Wenn ich das gesehen habe, wäre mein erster Gedanke, dass ich die falsche Datei geöffnet habe. –
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 –