APUE学习笔记二——流
21 August 2014
流和FILE对象
- 所有I/O函数都是围绕文件描述符的。
- 对于标准I/O库,它们的操作是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。
- __流的定向__决定了所读、写的字符是单字节还是多字节。当一个流最初被创建时,它并没有定向。如果在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。如果在未定向的流上使用一个单字节I/O函数,则将该流的定向设为字节定向的,相关函数:
freopen()、fwide()
。 - 为了引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。
- 预定义文件指针:
stdin、stdout、stderr
。
缓冲
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。 3种类型的缓冲:
- 全缓冲:在填满I/O缓冲区后才进行实际I/O操作。
- 行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。
- 不带缓冲
相关函数:setbuf()、setvbuf()
流的操作
- 打开/关闭流
fopen()、freopen()、fdopen()、fclose()
- 读和写流
- 每次一个字符的I/O:
getc()、fgetc()、getchar()、ferror()、feof()、clearerr()、ungetc()、putc()、fputc()、putchar()
; - 每次一行的I/O:
fgets()、gets()、fputs()、puts()
; - 直接I/O:
fread()、fwrite()
,能够实现一次读或写一个数据结构。fread和fwrite返回读或写的对象。数对于读,如果出错或到达文件尾端,则此数字可以少于要求的数字。在这种情况,应调用ferror或feof以判断究竟是哪一种情况。对于写,如果返回值少于所要求的数字,则出错。
- 每次一个字符的I/O:
- 定位流
- V7:
ftell()、fseek()、rewind()
; - Single UNIX Specification:
ftello()、fseeko()
; - ISO C:
fgetpos()、fsetpos()
。
- V7:
格式化I/O
- 格式化输出:
printf()、fprintf()、dprintf()、sprintf()、snprintf()
以及它们的变体(各函数名前加v); - 格式化输入:
scanf()、fscanf()、sscanf()
。
获取文件描述符
每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno
函数以获得其描述符。
临时文件
ISO C:tmpnam()、tmpfile()
。
内存流
fmemopen()、open_memstream()、open_wmenstream()
时间和日期例程
由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)公元1970年1月1日 00:00:00这一特定时间以来经过的秒数。
time()、clock_gettime()、clock_getres()、clock_settime()、gettimeofday()、gmtime()、localtime()、mktime()、strftime()、strftime_l()