繁体   English   中英

fread_s读取错误的字节数

[英]fread_s reading the wrong amount of bytes

我正在读取带有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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM