Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1371584
  • 博文数量: 284
  • 博客积分: 3251
  • 博客等级: 中校
  • 技术积分: 3046
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 17:23
文章分类

全部博文(284)

文章存档

2019年(2)

2018年(5)

2015年(19)

2014年(13)

2013年(10)

2012年(235)

分类:

2012-11-27 15:54:59

原文地址:apue: 5 standard I/O library 作者:zengxg14

     以前没想过将看的总结什么的, 所以是从第五章开始。不过第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) |
给主人留下些什么吧!~~