用c编写和读取二进制文件

问题描述

我正在尝试将一个整数写入二进制文件,然后读取相同的内容。但是,我的程序读取的数字与写入的数字不同。我做错了什么?

unsigned short int numToWrite = 2079;
    // Write to output
    FILE *write_ptr;
    write_ptr = fopen("test.bin","wb");  // w for write,b for binary
    printf("numToWrite: %d\n",*(&numToWrite));
    fwrite(&numToWrite,sizeof(unsigned short int),1,write_ptr); // write 10 bytes from our buffer
    fclose(write_ptr);

    // Read the binary file
    FILE *read_ptr = fopen(filename,"rb");
    if (!read_ptr) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    unsigned short int* numToRead = malloc(sizeof (unsigned short int));
    fread(numToRead,read_ptr);
    printf("numToRead: %d\n",*numToRead);
    free(numToRead);
    fclose(read_ptr);

输出是这样的:

numToWrite: 2079
numToRead: 26964

解决方法

man printf

长度修饰符

h - 以下整数转换对应于短或无符号短参数,...

转化说明符

d,i - int 参数被转换为有符号十进制表示法。

格式字符串的格式

...
每个转换规范都由字符 % 引入,并以转换说明符结尾。中间可能有(按此顺序)零个或多个标志、可选的最小字段宽度、可选的精度和可选的长度修饰符。

您使用的是 unsigned short int,但这不是您要告诉 printf 的内容。 因此,您的期望没有得到满足。

,

一些正在发生的事情:

'printf' 没有任何二进制格式说明符,因此您必须手动进行。

您需要深入了解数据类型及其范围,因此我建议使用此来源:Microsoft Data Type Ranges. 它说的是 C++,它无关紧要,因为它让您对范围有了一个很好的了解。

我知道这不是你的完整代码,但只要了解我所看到的一些未定义的内容,例如“文件名”。

如果有人提到atoi()和itoa(),请记住这一点,理论上你可以使用atoi()和itoa(),但是请注意atoi()和itoa()是一个非标准函数一些编译器支持。

最后,你为什么要使用 'unsigned short int'、'*(&numToWrite)' 并且你可以从程序中向我们展示?