格式化输出和fprintf

时间:2011-12-06 00:35:51

标签: c

我写了这个小C程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 FILE * fp;
 fp = fopen("data.txt","w");
 fprintf(fp,"%d",578); 
 return 0;
}

然后我使用xxd -b分析了data.txt。我期待我会看到578的32位表示,而不是看到578的ASCII表示:

xxd -b data.txt
0000000: 00110101 00110111 00111000                             578

为什么?假设小端,如何存储578(01000010 00000010 00000000 00000000)的32位表示?

4 个答案:

答案 0 :(得分:5)

使用fwrite

uint32_t n = 578;
fwrite(&n, sizeof n, 1, fp);

fprintf用于格式化的输出,从而尾随f

答案 1 :(得分:3)

这就是“格式化”的含义。您使用了限定符%d,这意味着“将给定值格式化为执行字符集中的 ASCII 数字表示,假设该值为有符号整数”。 / p>

如果要将二进制数据写入文件 - 不要使用格式化输出。请改用fwrite来编写原始二进制数据。

答案 2 :(得分:1)

您需要查看fwrite

int myNum = 578;
fwrite( &myNum, sizeof(int), 1, fp);

答案 3 :(得分:1)

如果您想使用标准IO工具将原始数据写入文件,那么您正在寻找fwrite(3)

$ cat numbers.c
#include <stdio.h>

int main(int argc, char* argv[]) {
    int i = 578;
    long l = 578;
    float f = 5.78;
    double d = .578;
    long marker = 0xFFFFFFFFFFFFFFFF;


    FILE *fp = fopen("data", "w");
    fwrite(&i, sizeof i, 1, fp);
    fwrite(&marker, sizeof marker, 1, fp);
    fwrite(&l, sizeof l, 1, fp);
    fwrite(&marker, sizeof marker, 1, fp);
    fwrite(&f, sizeof f, 1, fp);
    fwrite(&marker, sizeof marker, 1, fp);
    fwrite(&d, sizeof d, 1, fp);
    fclose(fp);
    return 0;
}
$ make numbers
cc     numbers.c   -o numbers
$ ./numbers 
$ xxd data
0000000: 4202 0000 ffff ffff ffff ffff 4202 0000  B...........B...
0000010: 0000 0000 ffff ffff ffff ffff c3f5 b840  ...............@
0000020: ffff ffff ffff ffff e5d0 22db f97e e23f  .........."..~.?
$ xxd -b data
0000000: 01000010 00000010 00000000 00000000 11111111 11111111  B.....
0000006: 11111111 11111111 11111111 11111111 11111111 11111111  ......
000000c: 01000010 00000010 00000000 00000000 00000000 00000000  B.....
0000012: 00000000 00000000 11111111 11111111 11111111 11111111  ......
0000018: 11111111 11111111 11111111 11111111 11000011 11110101  ......
000001e: 10111000 01000000 11111111 11111111 11111111 11111111  .@....
0000024: 11111111 11111111 11111111 11111111 11100101 11010000  ......
000002a: 00100010 11011011 11111001 01111110 11100010 00111111  "..~.?
$