我有一个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,或者你误解了一些东西。不管你有多少年的经验,这都是真的。
以十六进制表示的值10097161610x3c2f0bc1。将该值写入二进制文件时,将写入4个8位字节,值分别为0x3c0x2f0x0b0xc1。在ASCII中,这些字符是'<''/'和两个超出可打印ASCII范围的字符。它们的编写顺序取决于系统的终结性,但您报告的内容似乎与此一致。
我不知道你为什么希望看到000000003C2F0BC1。当你只写了4个字节的文件时,是16个字节。此外,二进制文件不包含您所写数据的十六进制表示的ASCII呈现——它们只包含数据。
如果您通过将文件从原始二进制转换为十六进制来检查该文件(如果您的系统有此文件,则使用hexdumpod -x命令),您应该会看到一些可识别的内容。
如果您以二进制模式打开文件并使用fread将数据读回uint32_t对象,那么您应该得到原始值1009716161back——这就是整个要点。

关于c - fwrite行为不正常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26153822/

10-15 18:25