ISO C标准I/O库使用流的概念读写文件。流是对数据传输的抽象,可以把流理解为从起点到终点间的字节序列。
标准I/O库通过维护进程空间内的缓冲区,减少read/write系统调用次数来提高I/O效率。之前介绍的Unbuffered I/O和文件描述符fd打交道,标准I/O则使用FILE指针。
typedef struct{ short level;/*缓冲区满程度*/ unsigned flags;/*文件打开状态标志*/ char fd;/*文件描述符*/ unsigned char hold;/*若无缓冲区不读取*/ short bsize; /*缓冲区大小*/ unsigned char *buffer; /*缓冲区位置*/ unsigned ar *curp; /*当前读写位置*/ unsigned istemp; /*临时文件指示*/ short token; /*用作无效检测*/ }FILE;
在打开文件时,标准I/O库负责自动分配缓冲区,还可以通过setbuf/setvbuf函数显式设置缓冲区类型、大小甚至关闭缓冲区。
#include"apue.h" int main(void) { int c; while ((c = getc(stdin)) != EOF) if (putc(c, stdout) == EOF) err_sys("output error"); if (ferror(stdin)) err_sys("input error"); exit(0); }
#include"apue.h" int main(void) { char buf[MAXLINE]; while (fgets(buf, MAXLINE, stdin) != NULL) if (fputs(buf, stdout) == EOF) err_sys("output error"); if (ferror(stdin)) err_sys("input error"); exit(0); }
fread和fwrite函数用于读写二进制数据。要注意的是,由于字节对齐、字节顺序、编译器、计算机体系结构差异,二进制读写兼容性比较差。
struct { short count; long total; char name[NAMESIZE]; } item; if(fwrite(&item, sizeof(item), 1, fp) != 1) err_sys("fwrite error");
读书笔记-APUE第三版-(5)标准IO库,布布扣,bubuko.com
原文:http://blog.csdn.net/idontwantobe/article/details/25003015