【发布时间】:2022-06-22 23:05:43
【问题描述】:
我正在涉足一些 Game Boy 保存状态黑客,我目前正忙于从 C 中的二进制文件中读取。我知道char 是一个字节,所以我正在读取字符使用以下代码
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main () {
FILE *fp = NULL;
char buffer[100];
int filesize;
fp = fopen("save file.srm", "r+"); //open
if(fp == NULL) printf("File loading error number %i\n", errno);
fseek(fp, 0L, SEEK_END); //seek to end to get file size
filesize = ftell(fp);
printf("Filesize is %i bytes\n",filesize);
fseek(fp, 0, SEEK_SET); //set read point at start of file
fread(buffer, sizeof buffer, 1, fp);//read into buffer
for(int i=70;i<80;i++) printf("%x\n", buffer[i]); //display
fclose(fp);
return(0);
}
我得到的输出是
Filesize is 32768 bytes
ffffff89
66
ffffff85
2
2
ffffff8b
44
ffffff83
c
0
我正在尝试以字节为单位加载,因此我希望输出的每一行都具有最大值 0xff。有人可以解释为什么我会得到 ffffff8b 吗?
【问题讨论】:
-
这是什么
strlen(buffer)+1?这些不是字符串:使用fread(buffer, sizeof buffer, 1, fp);或更好的大小和计数反转为fread(buffer, 1, sizeof buffer, fp);,并使用返回的值来控制下一个循环。 -
我也建议
printf("%02x\n", buffer[i] & 0xFF); -
... 或
printf("%02x\n", (unsigned char)buffer[i]); -
我猜文件大小是一样的。您正在打印非确定性内存。根据文件大小调整缓冲区大小。
标签: c binaryfiles