2014-10-02 65 views
0

我有一个C程序写入使用fwrite(..)文件,并且结果与我提供的函数的参数不一致。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位整数的元素,我想写入文件, 我做错了什么?

+2

该文件的权限是不相关的。将权限设置为777是没有意义的。除非实际需要文件,否则文件不应具有执行许可权,并且系统上的每个用户都可以写入文件的情况很少有意义。 – 2014-10-02 03:00:26

回答

0

猫helloop.txt A/<

cat打印字符数据。它不会以32位整数的形式在文件中打印4字节的值。

,我应该得到这个

猫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。

+0

是的,我拥有它,它向我展示了正确的输出。 – maxwell 2014-10-02 03:01:17

+0

你走了。 :)所以你的程序工作。你只是对'猫'有错误的期望 – codenheim 2014-10-02 03:02:16

2

您的程序完全按照您的要求进行了操作。一般而言,如果您编写的程序似乎行事不端,则不应该跳到操作系统,编译器或运行时库存在错误的结论。您的程序中存在错误的可能性更大,或者您错误地理解了某些内容。不管你有多少年的经验,这仍然是真实的。

值为1009716161,以十六进制表示,为0x3c2f0bc1。当您将该值写入二进制文件时,可以写入4个8位字节,值为0x3c,0x2f,0x0b0xc1。在ASCII中,这些是'<','/',以及可打印的ASCII范围之外的两个字符。它们的写入顺序取决于系统的字节顺序,但是您报告的内容看起来与此一致。

我不确定你为什么期望看到000000003C2F0BC1这是16字节,当你只写了4个字节的文件,而且二进制文件不包含你写的数据的十六进制表示的ASCII渲染 - 它们只包含数据

如果您从原始的二进制其转换为十六进制(使用,如果你的系统有它的hexdumpod -x命令)检查该文件,你应该看到的东西识别

。如果以二进制模式打开文件并使用fread将数据读回到uint32_t对象中,那么您应该得到原始值1009716161回来 - 这是整个点。