【3】标准io
1 – 文件的概念
文件就是存放在磁盘上的,一些数据的集合
2 – 系统调用和库函数
对文件的操作一般分成两大类函数,一类是系统调用,一类是库函数
系统调用:这一类函数就是通过直接操作linux内核从而控制硬件,例如open、read、write、close等
库函数:库函数的本质也是系统调用,只不过在操作linux内核之前,在内存中开辟了一块缓冲区,用 于保存一段时间执行而定系统调用,从而只需要执行一次系统调用就可以了,所以库函数就是为了减少系统调用的次数,例如:printf、scanf、fopen、fclose、fread、fwrite等等
3 – 对文件的操作方式
文件io:就是系统调用
标准io:就是库函数
4 – 标准io的缓冲区分类
缓冲区的作用就是为了减少系统调用的次数,从而节省资源
缓冲区的分类:
行缓冲:一般对终端的操作就是行缓冲
全缓冲:一般对文件的操作就是全缓冲
无缓冲:一般标准出错输出是无缓冲,就是没有缓冲区
注意:如果想执行系统调用,必须刷新缓冲区
5 – 行缓冲的刷新条件
#include <stdio.h>
int main(int argc, char const *argv[])
{
//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
//printf("hello world");
//刷新缓冲区方法1:使用\n
//printf("hello world\n");
//刷新缓冲区方法2:程序正常结束
//printf("hello world");
//return 0;
//刷新缓冲区方法3:使用fflush函数刷新缓冲区
//printf("hello world");
//fflush:刷新函数。可以刷新指定的缓冲区
//stdout:标准输出,就是对终端进行写操作
//fflush(stdout);
//刷新缓冲区方法4:当缓冲区满的时候自动刷新
//默认行缓冲的大小为1024个字节
int i;
for(i = 1; i < 300; i++)
{
printf("%03d ", i);
}
while(1)
;
return 0;
}
5 – 全缓冲的刷新条件
1、使用fflush函数
2、程序正常结束
3、缓冲区满
6 – 文件指针(流指针或者流)
文件指针类型类型:
FILE *
typedef struct _IO_FILE FILE;
文件指针的本质就是一个结构体指针,结构体中保存了当前文件的信息
文件指针用于标识一个文件,对文件指针的操作就是对文件的操作
当一个程序运行时会自动创建三个文件指针:
stdin 标准输入,从终端读取数据
stdout 标准输出,向终端写数据
stderr 标准错误输出