以前没想过将看的总结什么的, 所以是从第五章开始。不过第3,4章的会补上来的, 因为有点忘了, 所以还是再看看。总结是按照书上的小节来的。
标准IO库中的讨论以流为中心,当你用fopen打开一个文件后得到一个FILE指针,这时就说将一个流与一个文件进行了关联。linux里读写时不用区分文本文件和二进制文件。对于文本流,流的orientation决定在对该流进行读写时是单字节还是多字节的。而流的orientation由创建流后的第一个读写操作决定。可以用freopen来清楚orientation信息,也可以用fwind来设置一个流的orientation(当然只能在创建流后开始设置)。
当打开一个流后就会得到一个FILE指针,该指针指向一个FILE对象(一般为结构体),其中保存一些有用信息,如文件描述符,流缓冲区指针,缓冲区大小,缓冲区中字符个数,error标志和eof标志等等。(当给你一个FILE指针的时候, FILE指针必对应一个文件,那么如何从该FILE指针得到该文件在系统中的路径?)
与STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO对应有三个预定义的文件指针stdin,stdout,stderr。
标志IO库提供缓冲区是为了减少系统read和write函数调用。三种类型的IO缓冲区:
全缓存:只有当缓冲区被填满或者调用fflush的时候才flush缓冲区,flush缓冲区的意思是指将缓冲区的数据写入对应的文件。
行缓冲:当行缓冲区满或者在读写时遇到回车字符时就会flush缓冲区
无缓冲:数据不缓冲而立刻被读写。
一般stdin和stdout为行缓冲,stderr为无缓冲。
缓冲区一般默认的由库自己malloc自己管理,也可以使用setbuf和setvbuf来自己定义缓冲去。setbuf将缓冲区设为自己指定的区域,setvbuf还能设置缓冲区的类型(_IOFBF, _IOLBF, _IONBF)。
打开一个流可以用fopen,freopen,fdopen函数,均返回一个FILE指针。freopen可以将指定的流重新关联到另一个文件上。而fdopen则根据文件描述符来返回一个FILE指针,可以用于打开一些管道或sockets,因为这些特殊类型的文件不能用fopen打开,于是便用其他系统函数来获取文件描述符,然后获得FILE指针。
打开文件时指定文件打开的方式r,w,a等等。用r和r+方式打开文件时要求文件必须已存在,用w和w+方式打开文件时,文件大小会被先截为0,即文件内容被删。
fclose函数关闭流,流关闭前会自动释放缓冲区,要输入的数据被丢弃,要输出的数据被flush。如没调用fclose,当程序终止时也会这么做。
流的读写
非格式化IO:字符读写IO,行读写IO,直接IO 三种方式。
字符读写IO
getc,fgetc,getchar。getchar等价于getc(stdin)。getc可能是用宏的方式实现的。这三个函数返回读取的字符,注意返回值的类型是int型,因为如果读到文件末尾或出错就返回EOF,EOF则是-1。那如果返回EOF该如何判断是流读取出错还是到了文件末尾呢?上面说了FILE结构中保存了流的error标志和eof标志。使用ferror和feof来测试这两个标志。可以用函数clearerr来清除这两个标志。
ungetc函数用于像流中压回字符。注意字符是压回流中不是文件中。压回后可以用fgetc再读出来。
相应的有putc,fputc,putchar。
行读写IO
gets和fgets。永远不用gets。相应的有puts和fputs。虽然fgets读到换行就停止读入了,但fputs不会输出到换行就停止输出。调用fgets后会自动flush标准输出。
直接IO(二进制IO)
即fread和fwrite函数。
需要注意的是如果需要读出刚写入的东西,可能需要关闭文件或rewind文件。因为写入的时候文件当前位置发生了变化。
流的定位
有三种方式:
1: ftell和fseek,文件位置保存在long型变量里。
2: ftello和fseeko,文件位置保存在off_t型变量里,这两个函数在C标准里应该没有。
3: fgetpos和fsetpos,文件位置保存在抽象数据类型fpos_t中。
格式化IO
printf,fprintf,sprintf,snprintf,vprintf,vfprintf,vsprintf,vsnprintf。
scanf,fscanf,sscanf,vscanf,vfscanf,vsscanf。
fileno函数使用一个FILE指针为参数,返回对应的文件描述符。
临时文件
tmpnam返回一个有效路径,tmpfile生成一个临时的二进制文件
阅读(1203) | 评论(0) | 转发(0) |