fwrite表现不佳

时间:2014-10-02 02:51:07

标签: c binary fwrite

我有一个使用fwrite(..)写入文件的C程序,结果与我提供的函数参数不一致。

  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位整数的元素,我想写入文件, 我究竟做错了什么 ?

2 个答案:

答案 0 :(得分:2)

你的程序完全按照你所说的去做。

通常,如果您编写的程序似乎行为不端,则不应该跳到操作系统,编译器或运行时库出错的结论。你的程序中存在错误,或者你误解了某些内容的可能性更大。无论你有多少年的经验,这都是正确的。

以十六进制表示的值10097161610x3c2f0bc1。将该值写入二进制文件时,将写入4个8位字节,其值为0x3c0x2f0x0b0xc1。在ASCII中,它们是'<''/',以及可打印ASCII范围之外的两个字符。他们编写的顺序取决于您的系统的字节顺序,但您报告的内容似乎与此一致。

我不确定您为什么希望看到000000003C2F0BC1。当您只向文件写入4个字节时,该字节为16个字节。此外,二进制文件不包含您所写数据的十六进制表示的ASCII呈现 - 它们只包含数据。

如果通过将文件从原始二进制转换为十六进制来检查文件(如果您的系统有,请使用hexdumpod -x命令),您应该看到可识别的内容。

如果以二进制模式打开文件并使用fread将数据读回uint32_t对象,则应该返回原始值1009716161 - 这是整点。

答案 1 :(得分:0)

  

cat helloop.txt   A /&LT;

cat打印字符数据。它不会将文件中的4字节值打印为32位整数。

  

因为我应该得到这个

     

cat helloop.txt   000000003C2F0BC1

不,你不应该,而不是cat。如果您希望获得该字符串,则必须将字符串“000000003C2F0BC1”写入该文件。该文件可能长度为16个字符。我现在打赌,如果你运行ls -l helloop.txt,你会看到大小4,因为你在文件中写了一个uint32_t二进制整数。

  

我做错了什么?

据我所知,你唯一错误的做法就是期望cat将你的uint32_t打印成十六进制表示。 (虽然我没有检查你的十六进制值,所以也可能不正确)

看看您的Linux机器上是否有hexdump,它可能会给您带来更好的结果。

编辑:如果您确实想要将uint32_t打印为十六进制字符串,则可以将fprintf(..., "%x", x)xX格式说明符一起使用,但请记住,这不是与fwrite / fread兼容,所以要读回来你必须读入字符串并从十六进制转换回int。