Es gibt verschiedene Dinge, die Sie in Ihrem C verbessern könnten ++ Code, aber es gibt eine Reihe von Gründen, warum Sie mit diesem Verhalten am Ende:
Zuerst wurde die Variable state
ist vom Typ size_t
, aber Ihre Code versucht, seinen Wert mit fread(&state, sizeof(int), 1, pFile);
zu initialisieren. Jetzt, wenn sizeof(state) != sizeof(int)
dann haben Sie undefiniertes Verhalten. Wenn sizeof(state) < sizeof(int)
, dann überschreibt die fread
-Anweisung in der Regel einige willkürliche Speicher nach dem Speicher für die Variable state
. Dies führt zu undefiniertem Verhalten (z. B. kann state
einen zufälligen großen Wert haben und die Zuweisung schlägt fehl).
Zweitens, wenn sizeof(state) > sizeof(int)
, werden dann nur teilweise state
initialisiert, und sein tatsächlicher Wert hängt sowohl von dem initialisiert (durch fread
) und die nicht initialisierten Bits. Daher kann der Wert eine große Zahl sein und die Zuweisung kann fehlschlagen.
Drittens, wenn die sizeof(state) == sizeof(int)
dann könnte es nur sein, dass der Wert gelesen zu groß ist, und die Zuweisung einfach scheitert, weil Sie nicht genügend Arbeitsspeicher haben.
Viertens, der Wert, den Sie aus der Datei lesen, könnte eine andere Kodierung oder Endiannität haben.Wenn beispielsweise der Wert in der Datei im Big-Endian-Format geschrieben wurde, aber auf einer Little-Endian-CPU fread
ist, kann dies dazu führen, dass die Bytes falsch ausgetauscht werden. Möglicherweise müssen Sie die Bytes austauschen, bevor Sie den gelesenen Wert verwenden.
schlage ich Sie stattdessen einen feste Breite von Integer-Typ <cstdint>
(oder <stdint.h>
für Pre-C++ 11), wie beispielsweise für variable std::uint64_t
state
, liest den Wert mit fread(&state, sizeof(state), 1, pFile);
und dann byte-swap state
wenn die Die Endianität Ihrer CPU stimmt nicht mit der Endianz des in der Datei gespeicherten Werts überein.
Können Sie den Status vor der Zuweisung drucken und das Ergebnis veröffentlichen? –
Ein Debugger, ein Breakpoint und ein Watch-Fenster werden Ihnen wahrscheinlich sagen, wie groß das Ding ist, das Sie zuzuteilen versuchen. Meine Kristallkugel sagt mir, dass deine Größe in einer Form gespeichert ist, die nicht mit einer 'size_t' übereinstimmt, aber du behandelst sie dennoch als eine, insbesondere weil du die Größe eines' int' liest und darin speicherst eine 'size_t, die auf deiner Plattform wahrscheinlich 32bit und 64bit sind. Autsch. – WhozCraig
Ich wäre auch besorgt über Endianness, da dieser Code direkt in die interne Darstellung des Integraltyps liest, anstatt es aus Bytes zu konstruieren. Das OP könnte denken, dass er eine Ganzzahl mit dem Wert "0x000000FF" liest, aber stattdessen "0xFF0000000" erhält! – Hurkyl