扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在标准C中只定义了输出流、更新流的刷新,而输入流的刷新是未定义的。
创新互联自2013年创立以来,先为安庆等服务建站,安庆等地企业,进行企业商务咨询服务。为安庆企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
当然,在vc下面的fflush(stdin)是微软自己扩展的,而GCC下面是没有的。
c语言:
while( (c=getchar())!='\n' c != EOF)
;
c++:
cin.clear(); //这里如果用cin.clear(istream::failbit); 是不行的
cin.ignore(numeric_limitsstreamsize::max(),'\n');
用 cin.get()可以读入空格。
不过用过cin.get()后记得 给数据流清空。否则会有意料外的结果。cin.get()会连回车都读进去的。
如果不清空数据流 就不可以连续两次调用cin.get()。这样只有第一个cin.get()会读入数据,第二个读进去的只有一个回车。
清空数据流的函数是cin.sync()
用法如下:
char s1[100];
cin.get(s1,100);
cin.sync(); //此处清空输入流
最简单的是用fflush()函数。
此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。
函数原型:int fflush(FILE *stream) ;
函数功能:清除一个流,即清除文件缓冲区.
常用场合:
一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)
三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);
1、fflush(stdin)是清空输入缓冲区的意思。stdin就是标准输入 std即standard(标准),in即input(输入),合起来就是标准输入。 一般就是指键盘输入到缓冲区里的东西。
2、在清除文件缓冲区时使用,文件以写方式打开时将缓冲区内容写入文件。
例:
#include conio.h
#include io.h
#include stdio.h
#include string.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的注意事项
1、MSDN 文档里也清楚地写着:fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。以下是 C99 对 fflush 函数的定义:int fflush(FILE *stream);
2、如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。
3、fflush函数的行为是不确定的。fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,flush函数会给那些流打上错误标记,并且返回EOF,否则返回0。
4、如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的。
参考资料来源:百度百科—fflush(stdin)
C语言的I/O系统为用户提供了一个接口,该接口与实际的存取设备无关。只是设备的一个抽象表示形式。这个抽象的接口称为流,实际的设备称为文件。
C文件系统可以与各种设备一起使用,如打印机、硬盘、终端等,缓冲文件系统可以将每个设备转换成逻辑设备,即所谓的流。所有的流工作方式类似,所以很容易操作不同的设备。流有2种类型:文本流和二进制流。
文本流是一系列字符,可以由多行构成,每行由一个换行符终止。
二进制流是一系列字节,并与外部设备上的字节一一对应。
版本四
流 原从stream翻译来。
什么电脑外设控制,磁盘文件输入输出,只要是输入或者输出所产生的数据都是流。
从linux对于硬件设备的控制很容易看出,对于硬件和磁盘上的文件,C语言的操作方法基本上一样。linux中C语言也是把硬件当做文件进行操作。(本质上,它把外设与txt文本文件看成一类东西。)流的概念的提出,我认为是为了程序对于文本和硬件的一系列操作而设定的统一标准。从程序员角度来看,就不需要知道各个操作的细节,编程的时候,统一把外设都当成文件进行操作就OK了。比如对于声卡,先OPEN打开,然后write写入,就完成喇叭发声,然后close关闭。和对于文本操作基本一样。
不管对设备或是文件(广义上都是文件)的输入输出操作,而产生的数据,都是I/O流。而C语言中的I/O流能分为两种:文本流,二进制流。很容易看出文本流控制很二进制流控制的区别。你用TC,fopen打开一个MP3或者别的32位文件,然后读取,会发现用文本流打开后,文件只能读到开头一点点。因为32位音乐文件有很多的'00'数据,文本流会把它当做文件结束符而结束读取。而二进制流打开方式则可以从头读到尾。(这时候输出的时候可能存在点问题,实验的时候可以用二进制 流方式再写入到另外一个文件来观察。)
流是由输入输出产生的,是用于数据交换或转换的统一的标准(特指这一类的数据)。C++和一些编程语言中定义的流(stream)类,就是对这类数据的定义。并通过成员函数对“流”进行操作。这样,用户和程序,程序和外设之间都是通过“流”进行交互。而程序员不需要知道“流”的底层到底是怎么实现的。 就好像吃饭和排泄。数据流中定义了,先牙齿咀嚼,然后胃部消化,然后小肠吸收,然后大肠发酵,然后你懂的。你只需要CIN,还有COUT,就能控制吃喝拉撒。你管它是细嚼还是狼吞?你管它便秘还是拉肚子?吞吐量是电脑性能的事。你管它是先进小肠还是先进胃?底层是内核的事。你只需要拥有了CIN和COUT,你就拥有了一切。
从广义上来说,流也是文件,不同于txt文本类的文件(流属于数据,数据等同于文件)。你可以对流进行各种操作。缓冲区的定义,也是为了对流的操作。
综上,我们知道了,流是数据,流是标准,流是文件。流的作用我们知道了,那么“流”到底是个什么玩意呢?非常同意 448634095 所说的。用着用着自己就知道是什么玩意了。就好像刚开始学编程 闹不明白函数 是个啥意思,和数学上的函数一点也不一样。你现在知道整形是什么了吧?你能不能给我举个简单的列子给我解释下整形是什么?
注意:流和 输入输出的缓冲区是两个概念。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流