当前位置:  技术问答>linux和unix

setvbuf的问题

    来源: 互联网  发布时间:2017-01-05

    本文导语:  源程序: #include #include int main() {         char buffer[BUFSIZ];         char str[BUFSIZ];         FILE *fp;         if((fp=fopen("test.txt","r"))==NULL)         {                 perror("fopen error");       ...

源程序:
#include
#include
int main()
{
        char buffer[BUFSIZ];
        char str[BUFSIZ];
        FILE *fp;
        if((fp=fopen("test.txt","r"))==NULL)
        {
                perror("fopen error");
                exit(1);
        }
        setvbuf(fp,buffer,_IONBF,BUFSIZ);
        while(!feof(fp))
        {
                fgets(str,BUFSIZ,fp);
                printf(str);
        }
        fclose(fp);
        exit(0);
}
test.txt的内容是:
hello1
hello2
hello3
运行输出的结果是:
hello1
hello2
hello3
hello3
请问为什么会出现两行hello3,谢谢

|

#include
#include
#include
int main()
{
char buffer[BUFSIZ];
char str[BUFSIZ];
FILE *fp;
if((fp=fopen("D:\test.txt","r"))==NULL)
{
perror("fopen error");
exit(1);
}
setvbuf(fp,buffer,_IONBF,BUFSIZ);
while(!feof(fp))
{
fgets(str,BUFSIZ,fp);

printf(str);
memset(str,0,sizeof(str));       //打印之后清空缓冲str里面的内容
}
fclose(fp);
exit(0);
}


|
这个与setvbuf没有任何关系,这是C文本读取的常见陷阱,论坛上无数的人问,为什么最后一行会打印两次。

代码改成如下即可:

#include
#include
int main()
{
  char buffer[BUFSIZ];
  char str[BUFSIZ];
  FILE *fp;
  if((fp=fopen("test.txt","r"))==NULL)
  {
  perror("fopen error");
  exit(1);
  }
  setvbuf(fp,buffer,_IONBF,BUFSIZ);
  fgets(str,BUFSIZ,fp);
  while(!feof(fp))
  {
  printf(str);
  fgets(str,BUFSIZ,fp);
  }
  fclose(fp);
  exit(0);
}

    
 
 

您可能感兴趣的文章:

  • fflush() 和 setvbuf() 的问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3