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");
即可解决问题。
我正在用 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");
即可解决问题。