yuchu3d 2021-12-27 12:53 采纳率: 80%
浏览 61
已结题

C语言,缓冲区和刷新相关问题

最近在学习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

程序运行的结果:

img

这里有几个疑问:
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] 来承接存储数据,是不是更好?

请指教!谢谢!

  • 写回答

3条回答 默认 最新

  • churuxu 2021-12-27 14:04
    关注
    获得0.60元问题酬金

    你对这些函数的功能理解错了,
    setvbuf fflush 这些函数是针对写文件的,
    你要做每次读一行用fgets就行。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月4日
  • 修改了问题 12月27日
  • 修改了问题 12月27日
  • 创建了问题 12月27日

悬赏问题

  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题