文档介绍:C程序设计语言
第7章 I/O
孙志岗******@hit.
2017/11/10
1
Input and Output
I/O设备
输入设备
键盘、鼠标
软盘、硬盘、光驱(以文件的形式)
串行口、并行口、USB接口、IEEE1394口、网络端口
扫描仪、视频采集卡、电视卡、游戏杆、话筒
……
输出设备
显示器、打印机
软盘、硬盘、CD-R/DVD-R(以文件的形式)
串行口、并行口、USB接口、IEEE1394口、网络端口
音箱
……
单纯的输入设备或者单纯的输出设备越来越少
标准输入输出
字符界面的操作系统一般都提供标准输入与输出设备
DOS、Linux、Unix……
一般情况,标准输入就是键盘,标准输出就是终端显示器
操作系统有能力重定向标准输入与输出,比如让文件作为标准输入,打印机作为标准输出
这种重定向程序本身是感觉不到的
自来水厂
DOS下的标准输入输出重定向
程序prog如下
main(){ char c; while ((c=getchar()) != '\n') putchar(++c);}
输入重定向
prog < infile
输出重定向
prog > outfile
格式化输出——printf
int printf(const char *format, 参数1, 参数2, …);
参数format是用来控制格式的字符串
具体格式请见教材P130、P214
常用转换字符:%d、%c、%s、%.2f、%u、%ld
返回值是最后输出的字符串长度,出错返回EOF
printf并不对参数的类型及个数进行检查,所以一定要确切地把参数和前面的转换字符匹配好
这种参数形式不仅在C语言里应用广泛,很多其它语言、类库也对此进行了模仿、扩充
相似的库函数
sprintf、fprintf
格式化输入——scanf
int scanf(const char *format, 参数1, 参数2, …);
参数format是用来控制格式的字符串
具体格式请见教材P133、P216,与printf基本相同,但更简单
常用转换字符:%d、%c、%s、%f、%u、%ld
返回值是成功匹配的输入项的个数,遇到结尾返回EOF
所有参数必须是指针,且类型要与前面的转换字符匹配好
相似的库函数
sscanf、fscanf
因为其不安全,所以已经很少使用
文件(File)
不能仅依靠操作系统的输入输出重定向来进行文件访问,我们必须有能力主动访问文件
磁盘、光盘等能大量、永久保存信息的媒介,一般都以文件的形式给最终用户及应用程序使用
可以建立若干目录(文件夹),在目录里保存文件或者下级子目录。同目录下的文件不能同名
对我们目前而言,只要知道文件的路径(全目录)和文件名,就能使用该文件
这都是托OS的福
流(Stream)
“子在川上曰:逝者如斯夫”
涓涓的、潺潺的、浩瀚的、奔腾的水从我们面前流过。每一个水分子出现在我们眼中。你或许会记下她的样子,但她将永远不再出现
计算机中也有流的概念,一般称为数据流,也有叫做字节流、比特流的,还有很具体的文件流、视频流、音频流等
流处理基本方法是:读入当前流到输入的数据,处理,然后再读后续流入的数据,处理。输出流处理也大抵如此
计算机对流的控制能力很强,一般不仅可以控制流速,甚至还可以让流回流
文件访问
文件访问的基本模式
open:打开文件,获得对此文件的指针、引用和句柄等,以证明可以使用此文件
read:读文件。参数一般指明要读多少字节,读到哪块内存。每次调用此功能,都是接着上次调用的结束位置读。(所以是个输入流)
write:写文件。参数一般指明把哪块内存的内容写入文件,要写多少字节。每次调用此功能,都是接着上次调用的结束位置写。(所以是个输出流)
close:关闭文件,表明操作结束,不再使用此文件。文件使用完毕必须关闭,否则影响系统性能
seek:随机控制流的当前位置
C语言中的文件访问
下面介绍的函数均定义在<>中
int open(const char *pathname, int access);
int fd = open("C:\\", O_RDWR | O_CREAT);
filename是文件名,包含路径。如果不含路径,表示打开当前目录下的文件
access是打开方式,常用为O_RDONLY、O_WRONLY、O_RDWR与O_CREAT、O_TRUNC、O_APPEND的或运算
返回值为文件句柄,留待以后使用。如果打开失败,返回值为-1