Linux FILE文件操作1-文件指针、文件缓冲区(行缓冲、全缓冲、无缓冲)的验证
目录
1.文件指针
2.文件缓冲区
2.1 行缓冲
2.2. 全缓冲
2.3. 无缓冲
3. 程序验证:
(1)main.c执行test1(),打印hello world,不加 \n 换行符
(2)刷新缓冲区方法1:使用\n
(3)刷新缓冲区方法2:程序正常结束
(4)刷新缓冲区方法3:使用fflush函数刷新
(5)刷新缓冲区方法4:当缓冲区满的时候自动刷新,默认行缓冲的大小为1024个字节
1.文件指针
文件指针就是用于标识一个文件的,所有对文件的操作都是用对文件指针进行操作
定义文件指针的一般形式为:
FILE * 指针变量标识符;
本质上文件指针是一个结构体指针,结构体中包含了当前文件的很多信息,但是在实际
编程时,
不需要关系结构体中的成员,只需要使用文件指针即可
对文件操作的步骤:
1、对文件进行读写等操作之前要打开文件得到文件指针
2、可以通过文件指针对文件进行读写等操作
3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件
了
c语言中有三个特殊的文件指针无需定义,在程序中可以直接使用
1. stdin:
标准输入 默认为当前终端(键盘)
我们使用的scanf、getchar函数默认从此终端获得数据
2. stdout:
标准输出 默认为当前终端(屏幕)
我们使用的printf、puts函数默认输出信息到此终端
3. stderr:
标准错误输出设备文件 默认为当前终端(屏幕)
当我们程序出错使用:perror函数时信息打印在此终端
2.文件缓冲区
2.1 行缓冲
- 标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的。
- 所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区。
- 如果不刷新缓冲区,无法对文件执行读写操作。
2.2. 全缓冲
标准io库函数 ,往普通文件读写数据的,是全缓冲的, 碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区 。
刷新缓冲区的情况
1.缓冲区满了,刷新缓冲区
2.人为刷新缓冲区 fflush(文件指针)
3.程序正常结束 会刷新缓冲区
2.3. 无缓冲
在读写文件的时候通过系统调用io (read write),对文件进行读写数据
这个时候是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存
3. 程序验证:
(1)main.c执行test1(),打印hello world,不加 \n 换行符
程序:
#include <stdio.h>
void test1()
{
//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
printf("hello world");
}
int main(int argc, char const *argv[])
{
test1();
printf(" test 已执行 ");
while(1) ;
return 0;
}
运行结果:不加 \n 换行符,程序一直卡住,不能输出 hello world
(2)刷新缓冲区方法1:使用\n
程序:
#include <stdio.h>
void test2()//验证刷新缓冲区方法1:使用\n,缓冲区,程序可以正常输出
{
//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
printf("hello world\n");
}
int main(int argc, char const *argv[])
{
test2();
printf(" test 已执行 ");
while(1) ;
return 0;
}
运行结果:
(3)刷新缓冲区方法2:程序正常结束
#include <stdio.h>
int main(int argc, char const *argv[])
{
//刷新缓冲区方法2:程序正常结束
printf("hello world2 ");
return 0;
while(1) ;
return 0;
}
运行结果:程序正常结束,直接return,也可以正常输出
(4)刷新缓冲区方法3:使用fflush函数刷新
程序:
#include <stdio.h>
void test3()//验证缓冲区方法3:使用fflush函数刷新,程序可以支持输出
{
//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
printf("hello world3 ");
//fflush:刷新函数。可以刷新指定的缓冲区
//stdout:标准输出,就是对终端进行写操作
fflush(stdout);
}
int main(int argc, char const *argv[])
{
test3();
printf(" test 已执行 ");
while(1) ;
return 0;
}
运行结果:
(5)刷新缓冲区方法4:当缓冲区满的时候自动刷新,默认行缓冲的大小为1024个字节
程序:
#include <stdio.h>
void test4()//验证缓冲区方法4:缓冲区满,刷新
{
int i;
for(i = 1; i < 300; i++)
{
printf("%03d ", i);//3位数字,加1位空格,4个字节
}
}
int main(int argc, char const *argv[])
{
test4();
printf(" test 已执行 ");
while(1) ;
return 0;
}
运行结果:打印结果三个字符加一个空格,打印一次4字节, 256*4 = 1024