当前位置:首页 >> 单片机入门 >> 格式化io与非格式化io的对比理解

格式化io与非格式化io的对比理解

C语言 格式化 作者:admin 来源:不详 发布时间:2018-05-18 13:45:33   浏览:5

 测试函数1

#include

#include

int main()

{

int a[5]={65,66,67,68};

char value[10],i;

FILE *pf;

if(!(pf = fopen("printf.txt","w+")))

{

perror("open file:");

return -1;

}

fprintf(pf,"%d %c %d %c",a[0],a[1],a[2],a[3]);

sprintf(value,"%d %c %d %c",a[0],a[1],a[2],a[3]);

puts(value);

printf("%d",strlen(value));

fclose(pf);

return 0;

}123456789101112131415161718192021222324

这个程序的输出是:

65 B 67 D

9

从这个程序发现scanf家族对这个函数所作的事情就是将所有格式的变量以

一个文本的形式输出到我们指定的地方,不论是数组还是文件;

sprintf(value,”%d %c %d %c”,a[0],a[1],a[2],a[3]);

这个调用,

即先读到一个%d,对应a[0]是65,

就在value[0]放入6的ascii码然后在value[1]存入5的ascii码,下一个是空格就在value[2]保存空格的ascii

下一个是%c匹配a[2]就把a[2]的值直接当作一个ascii码存入value[3],以此类推….

所以最后得到字符串长度为9

测试程序2

#include

int main()

{

FILE *fp;

int a;

char b,c[100];

if(!(fp = fopen("scanf.txt","r+")))

{

perror("opend file:");

return -1;

}

fscanf(fp,"%d %c %s",&a,&b,c);

printf("%d %d %d\n",(int)a,(int)b,(int)*c);

fclose(fp);

return 0;

}12345678910111213141516171819202122

scanf.txt的内容是:

123 a abc

输出是:

123 97 97

scanf家族的原理也和printf相似:第一个参数类型是%d即读入一个整形赋值给a;

用一个空格分开123和a

就是为了让程序了解空格前1,2,3这三个字符都属于变量a;

所以a的值是经过:

(‘1’-‘0’) * 100 * +(‘2’-‘0’) * 10 + (‘3’-‘0’) * 1得到的;

得出结论:

理解二进制保存的方式和文本保存的方式:

在linux下:所有的文件都是按文本的方式存储和读取的,所以所有的文件打开的时候默认为是文本文件,当我们保存一些数字进入文档时,只能按字节翻译数字为对应的符号,这就是为什么打开一个可执行文件时会出现乱码的情况.因为可执行文件都是一些二进制机器码.

文件存储是一个个字节存储的,而且存储的都是一个二进制数,scanf和print只是用了字符数字互转的方法对文件或者数组元素

进行取放的.

对于格式化输入输出函数

文件存储是一个个字节存储的,而且存储的都是一个二进制数,scanf和print只是用了字符数字互转的方法对文件或者数组元素

进行取放的.

即:scanf按格式把 ascii码->所需格式保存至变量.

printf按格式把 某些格式变量->ascii码

方便文本软件按ascii码显示内容

至于非格式化io,即不格式化直接将数据原封不动一个个字节输出输入;

fgetc和getchar;fputc和putchar:即一个个字节输入输出;

fgets和gets;fputs和puts:即一次一行’\n’一个个字节输入输出;

fread和fwrite:即一次可控字节数输入输出;(直接忽略变量类型直接对内存按字节操作)

编辑:admin  最后修改时间:2018-05-18