前言
前一节 讲了 缓存的概念 在调用文件io的情况下
用户态 经过 库缓存 库缓存 不能 直接 和 内核态 交互 因为加了 死循环在中间。
在中间把他们隔开了 看到了输出并没有结果。
解决办法
这时就引出来了库缓存的概念来解决这个问题
也就是 用户态通过间接的方式访问内核态
并且在输出要加入换行符 之后 就不会受到 while(1);即可正常输出
前一节的补充
如果 写满 缓存 也可以 输出 也就可以调用系统函数 也就是写满就是 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 函数 可以解决不输出的问题 它会把剩余的缓存输出到磁盘里面去。因为我们把 while(1):放在了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 函数 就会被刷新数据。