C语言中字符输入输出与缓冲区

字符输入输出

单字符IO

  • getchar()和putchar()每次都处理一个字符,如果输入多于一个字符,则只读取第一个字符
  • getchar()就是 scanf(“%c”, &ch)的替代品,除了更加简洁,没有其它优势了
  • 或者说,getchar() 就是 scanf() 的一个简化版本

缓冲区

  • 什么是缓冲区
    • cache
    • 在内存中预留一部分空间,用来暂时保存输入或输出的数据
    • 使得两种不同速度的设备之间传输信息时进行平滑传输中的常用手段

在这里插入图片描述

  • 为什么引入缓冲区
    • 解决高速设备和低速设备存取速度的不匹配问题
    • 降低输入输出设备的读写次数
    • 输入字符后可以撤销,如果没有缓冲区,无法修改输入的字符
    • 缓冲区位于用户程序和硬件设备之间,用来缓存数据,目的是让快速的 CPU 不必等待慢速的输入输出设备,同 时减少操作硬件的次数。对于 IO 密集型的网络应用程序,比如网站、数据库、 DNS、 CDN 等,缓冲区的设计 至关重要,它能十倍甚至一百倍得提高程序性能
缓冲区类型
  • 根据设备的类型分为

    • 输入缓冲区
    • 输出缓冲区
  • 根据输入的数据

    • 全缓冲

      • 当缓冲区被填满后才进行真正的输入输出操作
      • 缓冲区的大小都是由限制的,4kb,4MB等
      • 数据填满缓冲区后就清空缓冲区
      • 典型代表就是对硬盘文件的读写
    • 行缓冲

      • 在输入输出的过程中遇到换行符时才执行真正的输入输出操作

      • 典型代表就是标准输入输出设备,键盘和屏幕

        int main()
        {
            printf("aaa");
            sleep(2);
            printf("/n");
        }
        

        运行后,aaa会等待两秒识别到换行符才会刷新缓冲区,输出aaa

    • 不带缓冲

      • 没有缓冲区,数据必须立刻进行输入输出
      • Windows下的printf()不带缓冲区,无论有无换行符都直接进行输出,别的系统可能会有不同
      • 错误信息输出函数perror()也没有缓冲区,错误信息必须立刻显示出来
  • %d和%c读取缓冲区的差别

    • 对于 %d,在缓冲区中,空格、回车、Tab 键都只是分隔符,不会被 scanf 当成数据取用。%d 遇到它们就跳过,取下一个数据。但是如果是 %c,那么空格、回车、Tab 键都会被当成数据输出给 scanf 取用
清空/刷新缓冲区
  • 刷新缓冲区就是将缓冲区中的内容送到目的地,遵循以下规则

    • 不管是全缓冲还是行缓冲,缓冲区满时会自动刷新
    • 行缓冲遇到换行符时会刷新
    • 关闭文件时会属性缓冲区;(Linux操作系统文件IO)
    • 程序关闭时会刷新缓冲区,由标准库保障
    • 使用特定的函数也可以刷新缓冲区
  • fflush() 是一个专门用来清空输出缓冲区的函数, stdout 是 standard output 的缩写,表示标准输出设备,也即显示器

fflush(stdout);
  • 清空输入缓冲区:很遗憾地说,没有一种既简洁明了又适用于所有平台的清空输入缓冲区的方案,只能将输入缓冲区中的数据都读取出来,但是却不使用

  • 使用 getchar() 清空缓冲区:每次从缓冲区中读取一个字符,包括空格、制表符、换行符等空白符,只要让getchar() 不停地读取,直到读完缓冲区中的所有字符,就能达到清空缓冲区的效果

    • 	int a,b;
      	char c;
      
      	scanf("%d",&a);
      	while((c=getchar())!='\n' && c!=EOF); 			
      
      	scanf("%d",&b);
      	printf("a=%d , b=%d\n",a,b);
      
      //好处是getchar() 一切字符通吃10 
      //坏处是额外定义一个变量 c,不适用强迫症患者
      
结束键盘输入
  • C语言如何判断键盘的输入的结束

    • 在输入前约定输入个数
    • 输入约定结束标记
      • 空格
      • 换行
      • EOF
  • 怎么用EOF结束输入

  • 在Linux下直接按Ctrl+D快捷键

  • EOF定义在stdio.h头文件中

    • #define EOF (-1)
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值