最近在学习C语言的过程中,对缓冲和刷新这一块,有比较模糊的地方,请指教。
先看一个程序吧,有点长 但是不复杂:
就是 打开一个文件,读取打印每一行,这里有很多种方法可以实现,我这个程序就是想测试一下设置缓存和刷新。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
char words[256];
char ch[256];
char find;
int i;
long len;
FILE *fp;
fp=fopen("122601.txt","r");
if (fp==NULL)
printf("Open is failed! \n");
else
printf("Open success! \n");
if(setvbuf(fp,words,_IOLBF,256)!=0)
printf("SETBUF FAILED! \n");
else
printf("SETBUF SUCCESS! \n");
len=ftell(fp);
printf("The len is %ld .\n",len);
fgets(words,256,fp);
printf("this line1 is : \n");
fputs(words,stdout);
fflush(fp);
len=ftell(fp);
printf("The len is %ld .\n",len);
fgets(words,256,fp);
printf("this line2 is : \n");
fputs(words,stdout);
fflush(fp);
len=ftell(fp);
printf("The len is %ld .\n",len);
fgets(words,256,fp);
printf("this line3 is : \n");
fputs(words,stdout);
fflush(fp);
len=ftell(fp);
printf("The len is %ld .\n",len);
fgets(words,256,fp);
printf("this line4 is : \n");
fputs(words,stdout);
len=ftell(fp);
printf("The len is %ld .\n",len);
printf("DONE!");
fclose(fp);
return 0;
}
122601.txt 文件的内容如下:
aa li qing yang will be a richer! aa
bb li qing yang will be a big richer! bb
cc li qing yang will be a very big richer! cc
dd li qing yang will be a very very big richer! dd
程序运行的结果:
这里有几个疑问:
1、 if(setvbuf(fp,words,_IOLBF,256)!=0) , 这里我设定的是行缓冲,为什么每次fflush(fp) 之后,文件指针怎么就移动到了文件的最后呢(len=177了)? 行缓冲,每次刷新之后,只刷新了一行,文件指针不是应该在行的末尾或者 下一行的行首吗? 怎么会跑到文件的末尾? 难道刷新的是整个文件的缓冲,可我设定的是 行缓冲啊。
2、到底什么是刷新? 比如这里我设定的行缓冲,每次刷新是不是就将该行缓冲清空了? 清空了之后,是立即就有新的流 补充进来 还是空在那里,等待你的下一步指令?
3、为什么每次刷新之后 ,flush(fp), 再读取的时候 都是 从第一行开始的呢?
4、setvbuf(fp,words,_IOLBF,256) ,这里我设定的缓冲区首地址是 wrods, words 是 我在前面定义的 字符数组words[256]. 但是在后面,我需要将fp文件的行,读取出来,我用的是 fgets(words,256,fp) , 我有个 疑问,因为 wrods 我设定成缓冲区了, 后面存储fp行数据的时候,我能否用words[256]这个数组来存放? 这样做是否正确? 结果也运行出来了,但是我不太明白。 是不是 再定义一个其他的数组比如ch[256] 来承接存储数据,是不是更好?
请指教!谢谢!