【APUE】标准io库

标准io库处理了很多细节,比如缓冲区的分配,以优化执行io

 
在之前的文件io中,所有的操作都是围绕文件描述符展开的,而对于标准io库,他们的操作则是围绕着流展开的,当用一个标准io库打开或者创建一个文件时,我们已经使一个流与一个文件相关联。
 
 
  • 缓冲
提供缓冲的目的是尽可能减少使用read和write的调用次数。
1.全缓冲:填满缓冲区后才进行实际io操作
2.行缓冲:当输入或者输出遇到换行符时执行io操作
3.不带缓冲:使出错信息可以尽快显示出来
 
一般的来说,出错信息是不带缓冲的,涉及到终端设备的其他流,是行缓冲的,其他情况下都是全缓冲的。
对于任何一个流,在打开该流的情况下,可以对流的类型进行改变,
setbuf和setvbuf
 
 
在任何时候都可以强制冲刷一个流
int fflush(FILE *fp)
 
 
 
  • 打开流
FILE *fopen(const char *restrict pathname, const char* restrict type);
打开一个指定的文件
FILE *fopen(const char *restrict pathname, const char* restrict type, FILE *restrict fp);
在一个指定的流上打开文件,若该流已经打开,就先关闭该流,若流已经定向,就先清除该定向,一般用于将一个文件打开为标准流
FILE *fdopen(int fieldes, const char *type);
获取一个现有的文件描述符(可以从open dup dup2 fcntl pipe socket socketpair accept函数中获取)并且使一个标准io流与之相结合。常用于由创建管道和网络通信管道函数返回的描述符。
 
 
用flose关闭一个流
关闭之前会冲洗缓冲区中的输出数据,丢弃缓冲区中的任何输入数据。若已经分配一个缓冲区,则释放该缓冲区。
 
 
  • 读和写流
1)每次一个字符的io,如果流是带缓冲的,那么标准io函数会处理所有缓冲
一次读一个字符:
int getc(FILE *fp); 可以实现为宏,参数必须是没有副作用的表达式
int fgetc(FILE *fp); 一定是一个函数,所以可以获得其地址
int getchar(void); 
 
 
判断出错或者是到达文件尾端
int ferror(FILE *fp);
in feof(FILE *fp);
void clearerr(FILE *fp);
 
 
将字符再次压入流中
int ungetc(int c, FILE *fp);
会清除流的文件结束标志
 
 
一次写一个字符
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
 
 
2)每次一行io
读入:
char *fgets(char *buf, int n , FILE *fp); 
从指定的流读入
char *gets(char *buf); 
从标准流读入, 不推荐使用,可能会导致溢出,并不将换行符存入缓冲区中。
 
 
输出:
int fputs(const char* str, FILE *fp);
int puts(const char *str);
 
 
3)二进制io
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwite(const void *ptr, size_t size, size_t nobj, FILE *fp);
一般用于读或者写一个二进制数组或者结构体
float data[10];
fwrite(&data[2], sizeof(float), 4, fp);
返回读或者写的对象数
 
 
 
  • 定位io流
1)
long ftell(FILE *fp);
int fseek(FILE *fp, long offset, int whence);
void rewind(FILE *fp);将一个流设置到文件的起始位置
 
2)
off_t ftello(FILE *fp);
int fseeko(FILE *fp, off_t offset, int whence);
实现中可以将off_t定义长于32位
 
3)
int fgetpos(FILE *fp, fpos_t pos);
int fsetpos(FILE *fp, const fpos_t *pos);
ISO C的标准,可以移植
 
 
 
 
  • 格式化io
printf
int fprintf(FILE *fp, const char *format,.....);
写到指定的流
int sprintf(char *buf, const char* format,....);
写到指定的数组buf中,最后端自动加一个null字节,但是不包括在返回值中,可能会导致溢出
int spnprintf(char *buf, size_t n, const char* format,....);
安全的写入,超出缓冲区的都会被丢弃
 
同样也有读书函数
scanf
int fscanf(char *buf, const char* format,....);
int sscanf(const char *buf, size_t n, const char* format,....);
 
 
 

转载于:https://www.cnblogs.com/w0w0/archive/2012/09/14/2685424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值