我有一个使用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位整数的元素,我想写入文件, 我究竟做错了什么 ?
答案 0 :(得分:2)
你的程序完全按照你所说的去做。
通常,如果您编写的程序似乎行为不端,则不应该跳到操作系统,编译器或运行时库出错的结论。你的程序中存在错误,或者你误解了某些内容的可能性更大。无论你有多少年的经验,这都是正确的。
以十六进制表示的值1009716161
为0x3c2f0bc1
。将该值写入二进制文件时,将写入4个8位字节,其值为0x3c
,0x2f
,0x0b
和0xc1
。在ASCII中,它们是'<'
,'/'
,以及可打印ASCII范围之外的两个字符。他们编写的顺序取决于您的系统的字节顺序,但您报告的内容似乎与此一致。
我不确定您为什么希望看到000000003C2F0BC1
。当您只向文件写入4个字节时,该字节为16个字节。此外,二进制文件不包含您所写数据的十六进制表示的ASCII呈现 - 它们只包含数据。
如果通过将文件从原始二进制转换为十六进制来检查文件(如果您的系统有,请使用hexdump
或od -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)
与x
或X
格式说明符一起使用,但请记住,这不是与fwrite / fread兼容,所以要读回来你必须读入字符串并从十六进制转换回int。