linux 行缓存

前言

 前一节 讲了 缓存的概念 在调用文件io的情况下
 用户态 经过 库缓存  库缓存 不能 直接 和 内核态 交互 因为加了 死循环在中间。
 在中间把他们隔开了 看到了输出并没有结果。

解决办法

 这时就引出来了库缓存的概念来解决这个问题
 也就是 用户态通过间接的方式访问内核态 
 并且在输出要加入换行符 之后 就不会受到 while1);即可正常输出  

在这里插入图片描述

前一节的补充

如果 写满 缓存 也可以 输出 也就可以调用系统函数 也就是写满就是 1024个字节
不过很少写够 但要知道这个方法。

三类读写函数 引出行缓存概念

在这里插入图片描述

上面的基本都是 标准io的系统函数 也就是在#include <stdio.h>里面的

fputs 函数

#include <stdio.h>
int main()
{
       char  writebuff[128]="hello";
       FILE *fd;
       fd=fopen("wowo","w+");
       if(fd==NULL){
         printf("fopen  is error\n");
       }
        printf("fopen  is succeessed\n");
        fputs(writebuff,fd);
        fclose(fd);
}

在这里插入图片描述

正常是可以输出的 

如果是这样呢 加上一个 while(1);

#include <stdio.h>

int main()
{
       char  writebuff[128]="hello";
       FILE *fd;
       fd=fopen("wowo","w+");
       if(fd==NULL){

         printf("fopen  is error\n");
       }
        printf("fopen  is succeessed\n");

        fputs(writebuff,fd);
        
        while(1);
       
        fclose(fd);
}

在这里插入图片描述

新开一个终端查看 
前面说了写满缓存 或者遇到 换行 就会调用系统函数 现在为什么不输出了呢
现在引入一个fclose函数 

加入 fclose函数

在这里插入图片描述

现在多了fclose 函数  可以解决不输出的问题 它会把剩余的缓存输出到磁盘里面去。因为我们把 while1:放在了fclose函数前面 所以他起不到作用
#include <stdio.h>

int main()
{
       char  writebuff[128]="hellow";
       FILE *fd;
       fd=fopen("wowo","w+");
       if(fd==NULL){
         printf("fopen  is error\n");
       }
        printf("fopen  is succeessed\n");

        fputs(writebuff,fd);

        fclose(fd);
}

在这里插入图片描述

while(1): 去掉  证明了 flclose 函数 能和 换行符 写满缓存功能一样
把 库缓存 写到内核态里面即可输出。

fgets 函数

在这里插入图片描述

 #include <stdio.h>

int main()
{
       char readbuff[128]={0};
       char  writebuff[128]="helloworld";
       FILE *fd;
       fd=fopen("wowo","r+");
       if(fd==NULL){

         printf("fopen  is error\n");
       }
        printf("fopen  is succeessed\n");

        fputs(writebuff,fd);  //写   
        fgets(readbuff,128,fd); //读  输出
        printf("%s\n",readbuff);//打印
        fclose(fd);

}

在这里插入图片描述

为什么 文件 有数据 但是 输出 不显示呢 这里很容易忽略的问题 
如果不手动把光标刚在最前面它会接着在写的后面继续往下读 
但是不是我们想要的 后面都是空了 读也毫无意义。

加入 fseek 函数

在这里插入图片描述

直接把它放在最开始的位置 (第0个位置开始读)
参数  fd,0,SEET_SET 
#include <stdio.h>

int main()
{
       char readbuff[128]={0};
       char  writebuff[128]="hellow";
       FILE *fd;
       fd=fopen("wowo","r+");
       if(fd==NULL){
         printf("fopen  is error\n");
       }
        printf("fopen  is succeessed\n");
       
        fputs(writebuff,fd);//写函数
        fseek(fd,0,SEEK_SET);//重新把位置放在第0
        fgets(readbuff,128,fd);//开始读 
        printf("%s\n",readbuff);//输出 

        fclose(fd);


}

在这里插入图片描述

读写的内容都对应了 哞了吗
简单说 行缓存 就是 遇到 换行符 或者 写满缓存 或者 scanf printf 函数 就会被刷新数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值