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

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

相关文章:

  • 电容器基础观念
  • 怎样使用Modbus转Profinet网关连接USB转485模拟从站配置案例
  • Elasticsearch 向量检索详解
  • Qt QML实现视频帧提取
  • Hive SQL 精进系列:SUBSTR 函数的多样用法
  • 【Idea】 xml 文本粘贴保持原有文本的缩进格式
  • 【NLP】 6. 词向量的可变性及其影响
  • 基于llama.cpp的QwQ32B模型推理
  • 机试准备第18天
  • Netty基础—7.Netty实现消息推送服务二
  • windows版本的时序数据库TDengine安装以及可视化工具
  • 图论——广度优先搜索实现
  • adb常用的命令
  • centos 7误删/bash 拯救方法
  • 腾讯云MySQL数据库架构分析与使用场景
  • esp32s3文心一言/豆包(即火山引擎)大模型实现智能语音对话--流式语音识别
  • 【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库
  • 浏览器好用的去广告插件和暗黑模式护眼插件
  • Ubuntu 配置 github 代理
  • 蓝桥杯备考----模拟算法 phone number
  • 智能终端出海服务创新联合体成立
  • 中办、国办印发《安全生产考核巡查办法》
  • 10台核电新机组获核准,上海核电厂商独揽超500亿元订单
  • 新质观察|重塑低空经济的系统安全观
  • 一场与纪录并行的伦敦马拉松,超40项新世界纪录诞生
  • 我的科学观|张峥:AI快速迭代,我们更需学会如何与科技共处