读取二进制文件时出现问题

Problems reading binary file

本文关键字:问题 二进制文件 读取      更新时间:2023-10-16

我正在尝试读取文件的前 6 个字节,但它给了我奇怪的结果,我似乎无法弄清楚我做错了什么。

我的代码:

struct Block {
char fileSize[3];
char initialDataBlockId[3];
};
int main(int c, char **a) {
ifstream file("C\main_file_cache.idx0", ios::binary);
Block block;
file.get((char*)&block, sizeof(block));
printf("File Size: %in", block.fileSize);
printf("Initial Data Block ID: %in", block.initialDataBlockId);
file.close();
system("pause");
return 0;
}

在运行代码之前,我在二进制编辑器中打开了文件, 它向我展示了这个十六进制代码:

00 00 00 00-00 00 05 af-4b 00 00 01-26 df cd 00
00 6f 03 3f-ed 00 03 61-05 08 35 00-04 8b 01 61
59 00 08 39-03 23 0a 00-05 6c 00 35-d0 00 06 fe
03 69 d8 00-07 19

总共有 54 个字节。前 6 个字节仅为零。

因此,我希望我的程序产生以下输出:

File Size: 0
Initial Data Block ID: 0

相反,输出如下所示:

File Size: 10419128
Initial Data Block ID: 10419131

这个结果毫无意义。也许我的代码有问题?

您应该在Block结构中使用类型unsigned char

您应该使用file.read()而不是file.get()来读取二进制数据。

您正在打印Block结构中数组的地址,而不是它们的内容,此外,说明符%i期望一个int,而不是一个char *,所以行为在未定义中,你会得到一些奇怪的整数值,但任何事情都发生了,包括程序终止。建议提高警告级别,以便编译器警告此类愚蠢的错误。

如果文件格式是小端序,您可以通过以下方式将这 3 字节数组转换为数字:

int block_fileSize =  (unsigned char)block.fileSize[0] + 
((unsigned char)block.fileSize[1] << 8) + 
((unsigned char)block.fileSize[2] << 16);
int block_initialDataBlockId =  (unsigned char)block.initialDataBlockId[0] +
((unsigned char)block.initialDataBlockId[1] << 8) +
((unsigned char)block.initialDataBlockId[2] << 16);
printf("File Size: %in", block_fileSize);
printf("Initial Data Block ID: %in", block_initialDataBlockId);

如果要读取二进制数据,可以使用ifstream中的read方法,也可以使用ofstream中的write方法。

istream & ifstream::read (char * s, streamsize n);
ostream & ofstream::write (const char * s, streamsize n);

您必须知道二进制模式对 UNIX 系统无用,文本模式仅有用。