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

linuxC语言缓冲区及小程序的实现

文章目录

  • 1.文件缓冲区
    • 1.1介绍
    • 1.2缓冲文件系统
    • 1.3冲刷函数fflush
    • 1.4认识linux下的缓冲区
  • 2.linux小程序的实现
    • 2.1 回车\r和换行\n
    • 2.2倒计时程序
    • 2.3进度条小程序
      • sleep/usleep
      • 代码
      • 运行结果

1.文件缓冲区

1.1介绍

为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。

1.2缓冲文件系统

系统自动地在内存为程序中每一个正在使用的文件开辟一块文件缓冲区。

  • 从内存向磁盘输出数据,先送到内存中的缓冲区,缓冲区装满后一起输送到磁盘上。
  • 从磁盘向计算机读入数据,从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),从缓冲区逐个地将数据送到程序数据区(程序变量等)。
  • 缓冲区的大小根据C编译系统决定。

1.3冲刷函数fflush

int fflush( FILE *stream );
将缓冲区内数据写到stream 指定文件。
成功返回 0 
错误返回 EOF 
高版本vs无法使用
fclose关闭文件时也会刷新缓冲区#include <stdio.h>
#include <windows.h>
int main() 
{FILE* pf = fopen("test7.txt", "w");if (!pf){perror(fopen);return 1;}fputs("abcdef", pf); //数据输出到buffer//此时文件中无内容Sleep(10000);        //睡眠10sfflush(pf);          //刷新缓冲区Sleep(10000);        //睡眠10s//此时数据到达文件fclose(pf);pf = NULL;return 0;
}

1.4认识linux下的缓冲区

在这里插入图片描述

在这里插入图片描述
在linux下gcc编译这两段代码时 结果是不同的 左边先输出后睡眠 右边先睡眠后输出

c语言不是从上到下一行一行执行的吗?

确实是的 实际上printf先于sleep执行但是sleep执行完后这个程序才结束 才会输出信息

为什么执行流到printf时 不直接显示以及为什么左边加了换行就能先显示?

c语言存在输出缓冲区(一段内存空间) 显示器设备一般的刷新策略是行刷新 即碰到\n就把\n之前的所有的字符显示出来 所以左边代码先显示 后边代码存入到缓冲区 直到程序结束才显示

当一个程序执行会自动打开stdin srdout stderr三个标准IO流

在这里插入图片描述

如何在没有换行符的情况下让他执行到printf时就显示?

在这里插入图片描述

#include <stdio.h>
#include<unistd.h>
int main()
{printf("hello linux!");fflush(stdout);sleep(3);return 0
}

2.linux小程序的实现

2.1 回车\r和换行\n

在这里插入图片描述

老式键盘的Enter: 实际上是 换行+回车[C语言中的\n也是]

在这里插入图片描述

#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\n",count);count--;sleep(1);return 0;}
}

可以正常输出

#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\r",count);count--;sleep(1);return 0;}
}

不输出任何内容

2.2倒计时程序

#include <stdio.h>
#include<unistd.h>
int main()
{int count = 5;while(count){printf("count是: %d\r",count);fflush(stdout);count--;sleep(1);return 0;}
}

每执行一次printf 将要输出的信息输出到缓冲区 当执行fflush函数时 将信息从缓冲区刷到显示器 之后\r回车 光标回到行首 count–

2.3进度条小程序

sleep/usleep

在这里插入图片描述

在这里插入图片描述

代码

在这里插入图片描述

运行结果

linu-vim-c-bar

http://www.lryc.cn/news/226086.html

相关文章:

  • MySQL数据库基本操作-DDL 数据库基础知识
  • 基于JavaWeb+SpringBoot+Vue摩托车商城微信小程序系统的设计和实现
  • idea代码快捷键Mac版
  • 分享76个Python管理系统源代码总有一个是你想要的
  • Springboot养老院信息管理系统的开发-计算机毕设 附源码27500
  • 在虚拟机中安装vim和net-tools,mysql
  • 【Excel】函数sumif范围中符合指定条件的值求和
  • k8s上对Pod的管理部分详解
  • 4.4.2 结构可以将 string类作为成员吗
  • npm install 安装总结
  • 二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
  • jenkins分步式构建环境(agent)
  • 前端开发学习指南
  • 环境变量小节
  • React Native适配Xcode 15 iOS 17.0+
  • Install Docker in Linux
  • Spring源码-循环依赖
  • Excel下拉填充时,如何使得数字不递增?
  • ThreadLocal原理以及内存泄露问题
  • 值之字符串(string)
  • pytoch安装指定版本教程pytorch1.3安装笔记
  • k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路
  • uni-app使用echarts数据不更新
  • 单挑特斯拉,华为智选车迈入第二阶段
  • acwing算法基础之搜索与图论--有向图的拓扑序列
  • Unity之NetCode多人网络游戏联机对战教程(7)--联机概念理解权威性Authority
  • Go并发编程(上)
  • MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法
  • Citespace的使用
  • [模块]ES6与cjs的混合开发