fread_s读取错误的字节数

时间:2018-01-21 03:26:43

标签: c++ file runtime-error eof unexpectendoffile

我正在使用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

1 个答案:

答案 0 :(得分:0)

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