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


    1.文件缓冲区

    1.1介绍

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

    1.2缓冲文件系统

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

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

    1.3冲刷函数fflush

    int fflush( FILE *stream );
    将缓冲区内数据写到stream 指定文件。
    成功返回 0 
    错误返回 EOF 
    高版本vs无法使用
    fclose关闭文件时也会刷新缓冲区
    
    #include 
    #include 
    int main() 
    {
    	FILE* pf = fopen("test7.txt", "w");
    	if (!pf)
    	{
    		perror(fopen);
    		return 1;
    	}
    	fputs("abcdef", pf); //数据输出到buffer
    	                     //此时文件中无内容
    	Sleep(10000);        //睡眠10s
    	fflush(pf);          //刷新缓冲区
    	Sleep(10000);        //睡眠10s
    	                     //此时数据到达文件
    	fclose(pf);
    	pf = NULL;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    1.4认识linux下的缓冲区

    在这里插入图片描述

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

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

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

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

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    #include 
    #include
    int main()
    {
    	printf("hello linux!");
    	fflush(stdout);
    	sleep(3);
    	return 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.linux小程序的实现

    2.1 回车\r和换行\n

    在这里插入图片描述

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

    在这里插入图片描述

    #include 
    #include
    int main()
    {
    	int count = 5;
    	while(count)
    	{
    		printf("count是: %d\n",count);
    		count--;
    		sleep(1);
    		return 0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以正常输出

    #include 
    #include
    int main()
    {
    	int count = 5;
    	while(count)
    	{
    		printf("count是: %d\r",count);
    		count--;
    		sleep(1);
    		return 0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    不输出任何内容

    2.2倒计时程序

    #include 
    #include
    int main()
    {
    	int count = 5;
    	while(count)
    	{
    		printf("count是: %d\r",count);
    		fflush(stdout);
    		count--;
    		sleep(1);
    		return 0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    2.3进度条小程序

    sleep/usleep

    在这里插入图片描述

    在这里插入图片描述

    代码

    在这里插入图片描述

    运行结果

    linu-vim-c-bar

  • 相关阅读:
    20221011study01
    UVA 294 约数 Divisors
    Pycharm服务器配置与内网穿透工具结合实现远程开发的解决方法
    网页中使用特殊字体
    Ubuntu 22.04上安装Anaconda,及 conda 的基础使用
    百科词条信息太陈旧,如何更新维护百度百科词条
    常用的原型工具有哪些?推荐这7款
    游戏缺少dll文件用什么修复?教你多种dll文件修复方法搞定!
    308场周赛 leetcode xp_xht123
    2022年比若依更香的开源项目
  • 原文地址:https://blog.csdn.net/LHRan_ran_/article/details/134321496