FILE mit fread -> unerklärliches Verhalten

Cromon

Erfahrenes Mitglied
Hallo zusammen

Ich habe eine Schleife in der in jeder Iteration folgender Code aufgerufen wird:
C++:
struct { uint32 ID, Size; } u;
auto read = fread(&u, 1, sizeof(u), f);
auto curPos = ftell(f);

unsigned char* navData = (unsigned char*)dtAlloc(u.Size, DT_ALLOC_PERM);

read = fread(navData, 1, u.Size, f);
curPos = ftell(f);

status = mesh->addTile(navData, u.Size, DT_TILE_FREE_DATA, 0, nullptr);

Dabei verläuft im ersten Durchgang dieser Schleife alles noch völlig problemlos, u.Size ist 388, anschliessend werden diese Daten ausgelesen und curPos ist nach dem ersten Durchgang korrekt 396. Anschliessend im zweiten Durchgang habe ich folgenden Ablauf:
C++:
read = fread(&u, 1, sizeof(u), f); // <- read == 8
// u.Size == 572
curPos = ftell(f); // 404 (= 396 + 8) -> korrekt
read = fread(navData, 1, u.Size, f); // read == 572 -> korrekt
curPos = ftell(f); // 4201 -> WTF?

Ich liess den Debugger mal noch weiter laufen und erhielt für den dritten Schleifendurchlauf folgendes Ergebnis:
C++:
read = fread(&u, 1, sizeof(u), f); // read == 8 -> korrekt
// u.Size == 2341234252 erwartungsgemäss falsch, da ja der offenbar willkürlich in der Datei ist
curPos = ftell(f); // 4209 -> das ist wiederum "richtig"
read = fread(navData, 1, u.Size, f); // read == 2403 -> kompletter Schwachsinn
curPos = ftell(f); // curPos == 82315

Ich sehe hier absolut keine Regel warum das passiert. Die ausgelesenen Mengen sind zwar jeweils korrekt, aber der Dateizeiger wird einfach absolut willkürlich in der Datei rumbewegt. Was könnte denn die Ursache dafür sein? Ich bin echt ratlos.

/EDIT:
Um das ganze etwas klarer zu formulieren habe ich ein externes Programm erstellt:
C++:
		FILE* f = fopen("Out\\1_39_28.nav", "r");
		fseek(f, 0, SEEK_END);
		uint32 size = ftell(f);
		fseek(f, 0, SEEK_SET);

		uint32 realFilePosition = 0;
		while(!feof(f)) {
			struct { uint32 ID, Size; } u;
			auto read = fread(&u, 1, sizeof(u), f);
			realFilePosition += read;

			std::cout << "Read struct, returned " << read << " bytes." << std::endl;
			std::cout << "Struct expects " << u.Size << " bytes." << std::endl;

			std::vector<char> data(u.Size);
			read = fread(data.data(), 1, u.Size, f);
			realFilePosition += read;

			std::cout << "Read " << read << " bytes of nav data." << std::endl;
			std::cout << "File expected to be at " << realFilePosition << " (is at: " << ftell(f) << ")" << std::endl;
			std::cout << std::endl;
		}

		fclose(f);

Ausgabe:
Code:
Read struct, returned 8 bytes.
Struct expects 388 bytes.
Read 388 bytes of nav data.
File expected to be at 396 (is at: 396)

Read struct, returned 8 bytes.
Struct expects 572 bytes.
Read 572 bytes of nav data.
File expected to be at 976 (is at: 4201)

Read struct, returned 8 bytes.
Struct expects 2017789394 bytes.
ERROR: Finished with error:
exception -> bad allocation

Grüsse
Cromon
 
Zuletzt bearbeitet:
Es ist offenbar zu früh/zu spät/zu wenig Alkohol/was weiss ich. Logischerweise müsste es "rb" und beim erstellen der Dateien "wb" heissen... Das erklärt auch warum es mit meiner ursprünglichen std::ifstream lösung auch nicht ging, std::ios::binary ist nicht optional!
 

Neue Beiträge

Zurück