回顾
-scanf读入原则
单字符读入,跳过空格制表换行
-getchar读入原则:单字符读入,读取每个字符包括空格制表换行与putchar一起被定义为供预处理器使用的宏,不是真正意义上的函数
I/O函数:所有系统都通用的具有可移植性的函数,处理文件输入、输出的程序也使用这些函数
宏
输入形式分两种:
-缓冲输入:按下enter键后才能使用输入的数据
-无缓冲输入:输入的字符立即被程序使用,多用于游戏中按键对应直接的指令。
ANSI和C规定输入都是缓冲的,但之前K&R时将输入类型交与编译器的编写者决定
-conio.h头文件:
提供支持无缓冲输入的函数
例如:
兼容IBM PC的编译器
回显无缓冲输入getche(回显即输入的字符直接显示在显示器上)
无回显无缓冲输入getch
UNIX系统中
ioctl(UNIX库函数,非c定义函数)指定待输入类型,然后使用getchar()完成相应操作
ansi c中 用setbuf()和setvbuf()控制缓冲,但因为系统内部设置可能无法使用,所以ANSI没有可以调用无缓冲输入的标准方式
缓冲区:临时储存区
-缓存区存在的意义:
将若干字符作为一个快传递比单个传递字符更有效率
可以修改输入时的错误,如没有缓存区,错误的数据将立即被使用,造成错误的计算结果。
缓冲类型
-完全缓冲I/O:在填满缓冲区之后才会刷新缓冲区,通常用于文件输入。缓冲区常见大小为512或4096字节。
-行缓冲I/O:在读入换行符后刷新缓冲区
处理文件
文件为储存器中储存信息的区域。
有些程序涉及处理一些文件,这需要程序去打开,读取,(甚至为文件读入新数据)然后关闭文件。这些处理文件的步骤可以通过c的库函数实现,也可通过主机操作系统的基本文件工具直接处理文件(这种直接调用操作系统的函数叫底层I/O),但是由于操作系统的不同(例如储存文件方式不同等)文件,无法为底层I/O建立标准库,还有一种方式就是使用I/O包,创建用于处理文件的标准模型和一套标准I/O函数
流:实际输入或输出映射的理想化数据流stdin流表示键盘输入,stdout流表示屏幕输入,getchar putchar printf scanf都是标准I/O包成员处理这两个流
判断文件结尾
-规定文件大小,超过字节将停止录入
-使用特殊字符标记结尾,Ctrl+Z。
除调用操作系统判断结尾外,c语言中getchar函数通过返回值EOF判断文件是否到达结尾,(getchar如读入成功返回值在0-255间)
重定向
-使用文件方式一:使用特定函数处理文件
-使用文件方式二:设计能与键盘和屏幕互动的程序,重定向输入到文件使用getchar获取内容和再从文件输出
c具有重定向特性且能在缺乏重定向特性的系统中模拟重定向。
重定向运算符
project<text file
-<-将程序和sdin流相连,读取文本文件中的字符
->-将程序和sdout流相连,输出文本文件中的字符、
如组合重定向的话,输出文件名不能和输入名一样,重定向运算符只能连接程序和文件,不可链接文件与文件,程序与程序,不可重定向多个对象。
->>-将输入数据添加到文件末尾
-|-将文件的输出连接到另一个文件的输入