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