目录
前言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;}