为了账号安全,请及时绑定邮箱和手机立即绑定

我没搞懂,它前面那个fprintf明明是输出嘛,怎么刷新的是输出流不是输入流?

我没搞懂,它前面那个fprintf明明是输出嘛,怎么刷新的是输出流不是输入流?

牛魔王的故事 2022-12-22 17:13:33
今天这段代码用fflush刷新这块,老师说fflush(fp)是刷新输入流,在全缓存。
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

这要看你输入什么了。有一个要点:scanf()的返回值是它成功读入值的个数。如果你第一次输入一个整数,那么第一个scanf函数会成功读入一个整数,它的返回值就是1,即ret的值是1。那么for循环的关系表达式:ret!=1就不成立,整个循环就不会执行,程序直接停止。如果你第一次输入了非整数,那么第一个scanf函数成功读入的值就是0,它返回0,即ret = 0。此时for循环的关系表达式:ret!=1成立,for循环才会开始迭代。如果你的程序执行的时候一直在打印,不给你输入的机会,说明你清空输入缓冲区的函数fflush没起作用,缓冲区里保存的第一次非法输入一直都在。你把 fflush(stdin); 改成: while(getchar()!='\n'); 就好了。

查看完整回答
反对 回复 2022-12-25
?
慕标5832272

TA贡献1966条经验 获得超4个赞

fflush() ;
清除标准输入缓存。
函数名: fflush
功 能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件
原型:int fflush(FILE *stream)
程序例:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>
void flush(FILE *stream);
int main(void)
{
FILE *stream;
char msg[] = "This is a test";
/* create a file */
stream = fopen("DUMMY.FIL", "w");
/* write some data to the file */
fwrite(msg, strlen(msg), 1, stream);
clrscr();
printf("Press any key to flush DUMMY.FIL:");
getch();
/* flush the data to DUMMY.FIL without\
closing it */
flush(stream);
printf("\nFile was flushed, Press any key\
to quit:");
getch();
return 0;
}
void flush(FILE *stream)
{
int duphandle;
/* flush the stream's internal buffer */
fflush(stream);
/* make a duplicate file handle */
duphandle = dup(fileno(stream));
/* close the duplicate handle to flush the DOS buffer */
close(duphandle);
}
fflush 的返回值类型是int类型,那么这个int类型具体的返回是什么呢?
返回值:
如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
注意:如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数。
fflush()函数
fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
注意事项:
C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。

 


查看完整回答
反对 回复 2022-12-25
  • 2 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信