我有一个C程序,它使用fwrite(..)写入文件,结果与我提供的函数参数不一致。
uint32_t x = 1009716161;
FILE * file = fopen("helloop.txt", "wb+");
rewind(file);
fwrite( &x, sizeof(uint32_t), 1, file);
fclose(file);
当我在之后检查文件时,它似乎包含了不能转换成任何东西的符号
>cat helloop.txt
>Á/<
因为我应该得到这个
>cat helloop.txt
>000000003C2F0BC1
我检查了文件的权限,把它修改了
chmod 777 helloop.txt
在我看来,我有一个32位整数的1元素要写入文件,
我做错什么了?
最佳答案
你的程序按你说的做了。
一般来说,如果您编写的程序看起来行为不正常,您不应该得出这样的结论:操作系统、编译器或运行库有问题。很可能你的程序中有一个bug,或者你误解了一些东西。不管你有多少年的经验,这都是真的。
以十六进制表示的值1009716161
是0x3c2f0bc1
。将该值写入二进制文件时,将写入4个8位字节,值分别为0x3c
、0x2f
、0x0b
和0xc1
。在ASCII中,这些字符是'<'
,'/'
和两个超出可打印ASCII范围的字符。它们的编写顺序取决于系统的终结性,但您报告的内容似乎与此一致。
我不知道你为什么希望看到000000003C2F0BC1
。当你只写了4个字节的文件时,是16个字节。此外,二进制文件不包含您所写数据的十六进制表示的ASCII呈现——它们只包含数据。
如果您通过将文件从原始二进制转换为十六进制来检查该文件(如果您的系统有此文件,则使用hexdump
或od -x
命令),您应该会看到一些可识别的内容。
如果您以二进制模式打开文件并使用fread
将数据读回uint32_t
对象,那么您应该得到原始值1009716161
back——这就是整个要点。
关于c - fwrite行为不正常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26153822/