标准IO库
这一章的重点是缓存的策略。
标准IO库 vs 系统调用
标准IO库 | 系统调用 |
---|---|
流,FILE * | 文件描述符 |
stdin | STDIN_FILENO |
… | … |
有缓存 | 无缓存 |
可移植性好 | 用于特定的系统 |
缓存
1、缓存策略:
- 全缓存:普通文件,缓冲区满才与磁盘同步,
fflush
强制写入 - 行缓存:stdin,stdout,遇上
换行符
才与磁盘同步;
一个简单的例子,可以体现出行缓存
// 10s后一块输出
#include<stdio.h>
int main()
{
for(int i=0;i<10;i++)
{
printf("%d",i); //所有都缓存,一块输出
sleep(1);
}
return 0;
}
// 1s输出一个
#include<stdio.h>
int main()
{
for(int i=0;i<10;i++)
{
printf("%d\n",i); //行缓存
sleep(1);
}
return 0;
}
- 无缓存:stderr,读写操作总是与终端同步;
大量输出程序速度会非常慢
// 1s输出一个
#include<stdio.h>
int main()
{
for(int i=0;i<10;i++)
{
fprintf(stderr,"%d",i); //无缓存
sleep(1);
}
return 0;
}
2、修改缓存策略:
库函数 | 功能 |
---|---|
setbuf | 设置缓存的大小 |
setbuffer | 设置大小或无缓存 |
setlinebuf | 设置为行缓存 |
setvbuf | 以上所有功能 |
3、标准输出重定向:fileno
获取FILE *的整数标识符,dup2
逐个打开和交换
4、打开与关闭文件:fopen
,fclose
5、读写单个字符…
6、读/写一行…
7、格式化输入输出
printf
:stdoutfprintf
:可重定向sprintf
:生成格式化字符串结果scanf
fscanf
sscanf
:从字符串中解析各个字段,读取日志文件
8、二进制读/写
9、文件中定位
不建议系统调用和标准库函数混合使用,原因是:缓存。
总结
这一期就是这些内容了。