当前位置: 首页 > article >正文

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 行缓冲

  1. 标准io库函数往标准输出(屏幕)输出东西的时候是行缓冲的。
  2. 所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区。
  3. 如果不刷新缓冲区,无法对文件执行读写操作

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


http://www.kler.cn/a/590715.html

相关文章:

  • Java学习------抽象类和接口
  • 图解AUTOSAR_CP_WatchdogDriver
  • 什么是梯度方差和缩放因子
  • Effective C++ 剖析(条款1~9)
  • 前端面试:axios 是否可以取消请求?
  • jmeter分布式原理及实例
  • 流量分析实践
  • Elixir语言的开源贡献
  • 【NLP】2. TF-IDF(Log 形式)
  • 评估大语言模型挑战和方法-AAAI2025
  • 《大语言模型》学习笔记(二)
  • 【网页】CSS原子化+变量尝试
  • Redis 服务器:核心功能与优化实践
  • 基于Spring Boot的红色革命文物征集管理系统的设计与实现(LW+源码+讲解)
  • DHCP中继实验
  • prototype和proto的区别
  • 本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)
  • Java中接口隔离原则简介和代码举例
  • 论文速递| ECG去噪新方法:小波+ CNN提升可穿戴精度
  • CMAKE学习系列(002)--- 如何添加宏定义