Я читаю файл коллекции (около 20 небольших файлов в одном) с fread_s
и содержание пишется в struct
, подобно 99% время, когда он читает данные правильно, но один раз, при всегда одной и той же позиции, он, кажется, игнорирует размер байта параметра размера элемента и просто читает 500 или около того байтов, пока не прервется и не сообщит feof
ошибка. Дело в том, что он даже не записывает последние три байта int в структуру.
Когда я уберу чеки и продолжу читать, он снова будет читать нормально, как будто ничего не произошло.
Я заметил, что _Placeholder
переменная в указателе файла меняется на другое значение, а затем обратно, но я думаю, это просто eof
ошибка при загрузке.
#pragma pack(push, 1)
struct fileHeader {
__int32 typeID;
bool isGFX;
char filename[8];
__int32 offset;
};
#pragma pack(pop)
#define HEADERSIZE 68
#define FILEHEADERSIZE 17
....
FILE *file;
fopen_s(&file, filename.c_str(), "r");
for (int i = 0; i < header.files - 1; i++) {
fseek(file, HEADERSIZE + i * FILEHEADERSIZE, 0);
fileHeader headerFile;
memset(&headerFile, 0, FILEHEADERSIZE);
int oldPointer = ftell(file); //118
int d = fread_s(&headerFile, FILEHEADERSIZE, FILEHEADERSIZE, 1, file); //returns 0
int newPointer = ftell(file); //630
int e = errno; //0
int ea = ferror(file); //0
int ef = feof(file); //1
//getting used here in a function
}
headerFile = {typeID=17 isGFX=true filename=0x00fefd05 "CURSORR" offset = 164} - offset should be 6820
Как сказал в комментариях Джонатан Леффлер, ошибка заключалась в том, что я не читал в двоичном режиме. простое изменение fopen_s(&file, filename.c_str(), "r");
в fopen_s(&file, filename.c_str(), "rb");
исправил проблему.
Других решений пока нет …