目录
- 前言
- fputc 函数
- fgetc 函数
- fseek函数
- rewind函数
前言
<sprintf fprintf 函数 >
前一节讲了 sprintf fprintf 函数 的缓存问题 在他们的基础上加了一个while(1);
来验证 结果都是输出的
不管怎么样 都会写入到内核态 内核态在输出到终端
并且注意 sprintf只是一个存放缓存的函数 还需要一个printf 来配合使用。
这节来讲 fputc fgetc 函数 的缓存问题
fputc 函数
fputc 简单理解就是往文件里面写入字符
#include<stdio.h>int main()
{FILE *fd;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}pritnf("fopen is success\n");fputc('a',fd);fclose(fd);return 0;}
如果证明是否是行缓存直接在后面加 while(1);就行了
#include<stdio.h>int main()
{FILE *fd;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}pritnf("fopen is success\n"); fputc('a',fd);while(1); flcose(fd);return 0;}
结果不输出 证明了 他不是行缓存 但是 有 缓存 怎么证明呢
在前面基础上加 fputc('\n',fd); 1 加入换行符 试试它会不会不受到while(1);的影响 正常情况 换行是行缓存成立的条件之一 反之就不成立。
#include<stdio.h>int main()
{FILE *fd;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}pritnf("fopen is success\n");fputc('a',fd);fputc('\n',fd);while(1);flcose(fd);return 0;}
文件里 还是没有内容 所以 fputc 不是行缓存 但有缓存。
说明 fputc 不是行缓存函数
fgetc 函数
用 fgetc 把fputc 内容(文件内容 )到输出终端
#include<stdio.h>int main()
{FILE *fd;int str;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}printf("fopen is success\n");fputc('a',fd);str=fgetc(fd);printf("str is %c\n",str);flcose(fd);return 0;}
为什么乱码呢
需要光标移动 因为fputc 到了最后 但是fgetc 却不知道。
fseek函数
这么配置就行了
SEEK_SET :从0开始
offest : 0单位
stream: 文件流
#include<stdio.h>int main()
{FILE *fd;int str;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}printf("fopen is success\n");fputc('a',fd);fseek(fd,0,SEEK_SET);str=fgetc(fd);printf("str is %c\n",str);flcose(fd);return 0;}
rewind函数
rewind(fd) = = fseek(fd,0,SEEK_SET);
写 rewind(fd) 就很方便
#include<stdio.h>int main()
{FILE *fd;int str;fd=fopen("w.c","w+");if(fd==NULL){printf("fopen is error\n");return -1;}printf("fopen is success\n");fputc('a',fd);rewind(fd);str=fgetc(fd);printf("str is %c\n",str);flcose(fd);return 0;}