格式化io与非格式化io的对比理解
测试函数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