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

测试函数1

#include<stdio.h>
#include<string.h>
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;
}

这个程序的输出是:
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<stdio.h>

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;
}

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:即一次可控字节数输入输出;(直接忽略变量类型直接对内存按字节操作)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值