0

我正在阅读一个集合文件(一个包含 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
4

1 回答 1

0

就像 Jonathan Leffler 在评论中所说的那样,错误是,我没有以二进制模式阅读。一个简单的改变fopen_s(&file, filename.c_str(), "r");fopen_s(&file, filename.c_str(), "rb");解决这个问题。

于 2018-01-21T11:07:22.223 回答