C 格式化输出和fprintf

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,这意味着“将给定值格式化为其在执行

我写了这个小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
,这意味着“将给定值格式化为其在执行字符集中的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  "..~.?
$