我正在使用fread_s
阅读一个集合文件(一个大约20个小文件),内容正在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
答案 0 :(得分:0)
就像Jonathan Leffler在评论中所说,错误是,我没有以二进制模式阅读。一个简单的更改fopen_s(&file, filename.c_str(), "r");
到fopen_s(&file, filename.c_str(), "rb");
解决了问题。