0.UNIX输入输出基本概念
Q1.程序与文件建立连接或通信有几种机制?流与文件描述字有什么区别? Q2.打开文件的实质?
打开文件就是程序与文件之间建立连接或通信。
流的类型是FILE;
文件描述字的类型是int;
流函数建立在文件描述字之上。
1.标准I/O 【针对流】
a. NULL
b.流与FILE对象
对于ASCII字符集,一个字符用一个字节表示。对于国际字符集,一个字符可用多个字节表示。
流的定向决定了所,读写的字符是单字节还是多字节的。
若在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。
若在未定向的流上使用一个单字节I/O函数,则将该流的定向设置为字节定向的。
freopen()清除一个流的方向;fwide()设置流的定向,但并不改变已定向流的方向。
c.打开与关闭流
fopen() 打开一个指定的文件
freopen() 在一个指定的流上打开一个指定的文件,如果该流已经打开,则先关闭该流。若该流已经定向,则freopen清除该定向。一般用于将一个指定的文件打开为一个预定义的流:标准输入,标准输出或标准出错。
fdopen() 获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。 用于由创建管道和网络通信通道函数返回的描述符。
标准I/O系统可以区分文本文件和二进制文件,但UNIX并不对这两种文件进行区分,所以UNIX系统环境下制定字符b作为type一部分实际没作用。
流引用终端设备,则该流是行缓冲的; 否则系统默认情况,流被打开时是全缓冲的。
fclose()
进程正常终止时:
d.读写流 {读的方式不同;写的方式不同}
(1) 每次一个字符的I/O;getc(),fgetc(),getchar()
(2) 每次一行 调用fgets()时,说明能处理的最大行长。gets()
(3)直接I/O{二进制I/O} fread()和fwrite(),每个对象具有指定的长度。从用于从二进制文件中每次读或写一个结构。
e.文件定位
(1) ftell()和fseek() V7就存在,文件位置存放在一个长整型中
(2) ftello()和fseeko() Single UNIX Specifcation ,使用off_t数据类型代替了长整型。
(3) fgetpos()和fsetpos() ISO C 使用一个抽象的数据类型fpos_t记录文件的位置
需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos.
对于非UNIX环境,二进制文件和文本文件的偏移量位置的计算。
f.文件结束和错误指示器
g.流缓冲 {全缓冲,行缓冲,不带缓冲}
h.格式I/O {格式输入;格式输出}
i.临时文件
Q 一般暂存什么数据?有什么特点?应用场景?相关函数{tmpnam(), tempnam(), tmpfile()}?函数使用举例?
j.其它:
{ESPIP错误};
FILE结构体 [include/linux/fs.h];
Q 文件位置起什么作用? 为什么fgets()是危险的函数?读回退?
Q.用setvbuf实现setbuf; printf返回0值意味着什么?;
2.低级I/O 【针对描述字】
b1.read()和write()函数;b2.readv()和writev()函数
c.文件位置
d.文件复制 dup()和dup2()
e.fdopen()和fileno()
f.fcntl()
g.非阻塞I/O {想到了周五看UNP的I/O模型}
阻塞I/O :调用必须等到操作完成,即读写到数据,才能返回。
h.fsync()和fdatasync()函数
3.终端I/O
http://blog.csdn.net/wubin1124/article/details/5155864
Q1.为何引入终端I/O
Q2.终端I/O概述,分为几种类型
?使用GTI提供的终端I/O控制函数改变终端的默认设置
4.高级I/O
参考:APUE; 《UNIX/Linux程序设计教程》;
/*wolflion(天行)整理,转载注明出处*/ 2013.3.17 version1.0