C 格式化输出和fprintf
我写了这个小C程序:C 格式化输出和fprintf,c,C,我写了这个小C程序: #include <stdio.h> #include <stdlib.h> int main() { FILE * fp; fp = fopen("data.txt","w"); fprintf(fp,"%d",578); return 0; } 为什么呢?如何存储578(01000010 00000010 00000000)的32位表示形式(假设为小尾端?这就是“格式化”的含义。您使用了限定符%d,这意味着“将给定值格式化为其在执行
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp;
fp = fopen("data.txt","w");
fprintf(fp,"%d",578);
return 0;
}
为什么呢?如何存储578(01000010 00000010 00000000)的32位表示形式(假设为小尾端?这就是“格式化”的含义。您使用了限定符%d
,这意味着“将给定值格式化为其在执行字符集中的ASCII数字表示形式,假设该值是有符号整数”
如果要将二进制数据写入文件-不要使用格式化输出。改为使用写入原始二进制数据。使用
fwrite
:
uint32_t n = 578;
fwrite(&n, sizeof n, 1, fp);
fprintf
用于格式化输出,您要查看尾随的f
如果要使用标准IO功能将原始数据写入文件,请查找
fwrite(3)
:
$cat numbers.c
#包括
int main(int argc,char*argv[]){
int i=578;
长l=578;
浮动f=5.78;
双d=0.578;
长标记=0xFFFFFFFFFFFF;
文件*fp=fopen(“数据”,“w”);
fwrite(&i,sizeof i,1,fp);
fwrite(&marker,sizeof marker,1,fp);
fwrite(&l,l的大小,1,fp);
fwrite(&marker,sizeof marker,1,fp);
fwrite(&f,sizeof,1,fp);
fwrite(&marker,sizeof marker,1,fp);
fwrite(&d,sizeof d,1,fp);
fclose(fp);
返回0;
}
$makenumber
cc编号。c-o编号
美元/个数
$xxd数据
0000000:4202 0000 ffff ffff ffff 4202 0000 B。。。
0000010:0000 0000 ffff ffff ffff c3f5 b840@
0000020:ffff ffff ffff e5d0 22db f97e e23f………...~。?
$xxd-b数据
0000000:01000010 00000000 00000000 11111111111 B。。。。。
0000006: 11111111 11111111 11111111 11111111 11111111 11111111 ......
000000c:01000010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000B。。。。。
0000012: 00000000 00000000 11111111 11111111 11111111 11111111 ......
0000018: 11111111 11111111 11111111 11111111 11000011 11110101 ......
000001e:10111000 0100000011111111111111111111111111111。@。。。。
0000024: 11111111 11111111 11111111 11111111 11100101 11010000 ......
000002a:00100010 11011011 11111 001 01111110 11100010 00111111“。?
$
初学者:那一个代表“文件”。是的,我知道,但是从你的最后一句话来看,它将永远是格式化的,不是吗?@初学者:这两个函数是FPrTrf(文件打印格式)和FrWrad(文件写)。如果问题的标记是C,为什么你链接到C++头?这是一个很好的参考,同样的函数在C和C++中都可用。如果你想要一个“纯”的C参考:是的,但我认为它令人困惑。也许你最好把“纯”C引用放在答案中。不,我选择了更好的引用,即使它来自C++站点。停止抱怨。你提供的两个链接都不是参考资料,而是第三方网站。这是一个参考:我退出了。为什么printf会变成ASCII?终端需要ASCII码吗?事实上,C从来没有提到“ASCII”。“在执行字符集中”是一个更合适的描述。@Bruce:printf
总是将其参数格式化以供人使用。它不用于写二进制。去掉ASCII,它确实可以是控制台设置的任何字符集。
uint32_t n = 578;
fwrite(&n, sizeof n, 1, fp);
int myNum = 578;
fwrite( &myNum, sizeof(int), 1, fp);
$ 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 "..~.?
$