我写了这个小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位表示?
答案 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 "..~.?
$