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

用c语言编写和读取二进制文件,c,binary,fwrite,fread,file-pointer,C,Binary,Fwrite,Fread,File Pointer,我试图将一个整数写入一个二进制文件,然后读取相同的内容。但是,我的程序读取的数字与编写的不同。我做错了什么 unsigned short int numToWrite = 2079; // Write to output FILE *write_ptr; write_ptr = fopen("test.bin","wb"); // w for write, b for binary printf("numToWr

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

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, sizeof(unsigned short int), 1, read_ptr);
    printf("numToRead: %d\n", *numToRead);
    free(numToRead);
    fclose(read_ptr);
输出如下:

numToWrite: 2079
numToRead: 26964

长度修改器

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

转换说明符

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

格式字符串的格式

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

您使用的是
unsigned short int
,但这不是您要告诉
printf
的。
因此,您的期望没有实现。

正在发生的一些事情:

“printf”没有任何二进制格式说明符,因此必须手动执行

你需要深入了解数据类型及其范围,所以我建议使用这个源:它表示C++,这是无关的,因为它给了你一个好的范围的概念。 我知道这并不是你的全部代码,但请理解我所看到的一些东西并没有定义,比如“文件名”

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


最后,为什么要使用“unsigned short int”、“*(&numToWrite)”,以及您可以向我们展示的程序中是否还有其他内容?

这不会编译,因为
filename
未定义。还有几个未声明的函数。请提供一个完整的例子。请提供一个。如果您使用“numToWrite”,那么当您使用“numToRead”时,为了清晰起见,您应该再次使用一个仅为一个短整型和一个非短整型*。这样,您也可以避免使用malloc