当前位置: 技术问答>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
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);
}
代码改成如下即可:
#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);
}