fflush 订阅
fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。 展开全文
fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
信息
外文名
fflush
头文件
stdio.h
功 能
清除读写缓冲区
中文名
刷新输出
原    型
int fflush(FILE *stream)
fflush概述
函数名: fflush功 能: 清除读写缓冲区,在需要立即把输出缓冲区的数据进行物理写入时头文件:stdio.h原型:int fflush(FILE *stream) 其中stream是要冲洗的流
收起全文
精华内容
下载资源
问答
  • fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。 fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。 fflush(stdout)这个例子可能不太明显,但对stdin很明显。 如下语句: int...
  • 冲洗所有 调用fflush(NULL)来所有打开的缓冲区。 var flushAll = require ( 'flush-all' ) ; flushAll ( ) ; 安装 npm install flush-all 执照 麻省理工学院
  • c语言中fflushIn this article, we’ll take a look at how we can use the fflush() function in C. 在本文中,我们将研究如何在C中使用fflush()函数。 The purpose of this function may not be immediately ...

    c语言中fflush

    In this article, we’ll take a look at how we can use the fflush() function in C.

    在本文中,我们将研究如何在C中使用fflush()函数。

    The purpose of this function may not be immediately clear to you, but you might take a hint from the name of the function.

    您可能不会立即清楚此功能的用途,但是您可能会从功能名称中得到提示。



    C语言中的fflush()函数 (The fflush() function in C)

    The fflush() function (Flush to File) is a function which flushes the contents of any output stream (or update stream) to the corresponding file.

    fflush()函数(刷新到文件)是将任何输出流 (或更新流)的内容刷新到相应文件的函数。

    
    fflush(file);
    

    Why do we need this function, and not just something like fprintf() or printf()?

    为什么我们需要此功能,而不仅仅是fprintf()printf()

    The answer is due to how the Operating System handles this input. Whenever we pass any output, the Operating System actually puts the content (which will be eventually written to the output file – like stdout) in a buffer.

    答案是由于操作系统如何处理此输入。 无论何时传递任何输出,操作系统实际上都会将内容(最终将写到输出文件中的内容,例如stdout )放在缓冲区中。

    This buffer will automatically get flushed at a file only at certain instances.

    仅在某些情况下,此缓冲区才会自动刷新到文件。



    了解对fflush()的需求 (Understanding the need for fflush())

    To illustrate a common issue that we face due to output buffering, consider the following code snippet.

    为了说明由于输出缓冲而面临的常见问题,请考虑以下代码片段。

    
    #include <stdio.h>
    
    int main() {
        fprintf(stdout, "This is to stdout. ");
        fprintf(stderr, "This is to stderr. ");
        fprintf(stdout, "This is also to stdout. ");
    }
    

    You might expect that the output comes in order, but the reality is a bit different.

    您可能期望输出顺序良好,但实际情况有所不同。

    
    This is to stderr. This is to stdout. This is also to stdout. 
    

    Why does this happen? This is because of how the files for stdout and stderr are buffered.

    为什么会这样? 这是因为如何缓冲stdoutstderr的文件。

    By default, stdout is newline-buffered, while stderr is unbuffered.

    默认情况下, stdout换行缓冲的 ,而stderr是未缓冲的

    What does this mean? For stdout, until there is a newline, the contents of the output stream are actually stored inside a temporary buffer.

    这是什么意思? 对于stdout ,直到出现换行符为止,输出流的内容实际上存储在临时缓冲区内。

    Only when the output stream encounters a newline (or end of file), will the contents be written to the stdout file. Notice the lack of a newline in our program!

    仅当输出流遇到换行符(或文件末尾)时,内容才会写入stdout文件。 注意我们的程序中缺少换行符!

    But, for stderr, the stderr stream is not buffered, so the contents are immediately written to it!

    但是,对于stderr ,不会缓存stderr流,因此会将内容立即写入其中!

    So, in our example program, since we don’t have a newline, stderr will be written first. Only after the end of file (output) is reached, will the contents of stdout be written!

    因此,在示例程序中,由于没有换行符,因此将首先编写stderr 。 只有到达文件末尾(输出)后,才会写入stdout的内容!

    So if you want to have stdout output first, without using a newline, you must flush the output buffer using fflush(). Makes sense?

    因此,如果要先stdout输出而不使用换行符,则必须使用fflush() 刷新输出缓冲区。 说得通?

    Let’s now add fflush() after writing to stdout, so that the contents are instantly written to the output file.

    现在让我们在写入stdout之后添加fflush() ,以便将内容立即写入输出文件。

    
    #include <stdio.h>
    
    int main() {
        fprintf(stdout, "This is to stdout. ");
        // Flush the contents of the output stream immediately
        fflush(stdout);
        fprintf(stderr, "This is to stderr. ");
        // No need to flush stderr since it is un-buffered
        fprintf(stdout, "This is also to stdout. ");
        // Flush the contents of the output stream immediately
        fflush(stdout);
    }
    

    Output

    输出量

    
    This is to stdout. This is to stderr. This is also to stdout. 
    

    Indeed, we have our problem solved for us, using fflush()!

    确实,我们使用fflush()为我们解决了问题!



    我可以将fflush(stdin)用于输入流吗? (Can I use fflush(stdin) for Input Streams?)

    The short answer is: No, don’t ever use this function.

    简短的答案是: ,永远不要使用此功能。

    The logic of flushing buffered output stream to files makes sense, since we know that the output contents will be eventually be written to a file / stream

    将缓冲的输出流刷新到文件的逻辑很有意义,因为我们知道输出内容最终将被写入文件/流

    But for input streams, there is no way of knowing where the input will end up eventually. For all you know, there may be some external program which feeds input randomly to this program, and you have no way of knowing what will happen to it!

    但是对于输入流 ,无法知道输入最终将在哪里结束。 就您所知,可能会有一些外部程序将输入随机地馈送到该程序,而您却无法知道它将发生什么!

    So, code of the form: fflush(stdin) is undefined behavior!!!

    因此,形式为fflush(stdin)是未定义的行为!!!



    结论 (Conclusion)

    In this article, we learned how we could use the fflush() function in C, to flush output buffers to files.

    在本文中,我们学习了如何在C中使用fflush()函数将输出缓冲区刷新到文件。

    For similar articles, do go through our tutorial section on C programming!

    对于类似的文章,请阅读我们有关C编程的教程部分



    参考资料 (References)



    翻译自: https://www.journaldev.com/39049/fflush-in-c

    c语言中fflush

    展开全文
  • fflush(stdio):清空输入缓冲区 fflush(stdout):清空输出缓冲区 1、什么是缓冲区? 缓冲区就是我们常说的缓存,属于内存的一部分。它依据对应的输入设备和输出设备把内存的一部分空间分为输入缓冲区和输出缓冲...

    解释:

    fflush(stdio):清空输入缓冲区

    fflush(stdout):清空输出缓冲区

    我们输入输出的内容都会先放到输入输出缓冲区中,那么先认识一下缓冲区。

    1、什么是缓冲区?

           缓冲区就是我们常说的缓存,属于内存的一部分。它依据对应的输入设备和输出设备把内存的一部分空间分为输入缓冲区和输出缓冲区。

    2、为什么会有缓冲区?

           一句话:减少对磁盘的读写次数,提高计算机的运行效率。

          why?  磁盘是机械结构,读取磁盘上面的东西需要磁头转动到相应的位置进行读取,而内存是电,一瞬间到达。减少磁盘的读取也利于磁盘的使用长久。

    3、缓冲区类型?

         全缓冲、行缓冲、不带缓冲

         3.1全缓冲 :填满I/O缓存后进行实际的I/O操作,eg:磁盘的读写

         3.2行缓冲 :输入输出遇到换行符时执行真正的I/O操作,eg:键盘的输入

         3.3不带缓冲 :直接进行显示,相当于直接刷新数据,,eg:stderr错误信息快速输出到标准错误文件中

    一、fflush(stdin)使用过程和分析过程如下:

    测试环境VS2019

    TestCode1:

    #include <stdio.h>
    int main()
    {
        int a;
        char b;
        scanf_s("%d", &a);
        scanf_s("%c", &b);
        printf("a=%d\n", a);
        printf("b=%d\n", b);
        return 0;
    }

    Out1:

    分析:只输入a,然后输出a,b,为什么没有输入b,但是b有值??

    因为在输入a后按回车,此时相当于把回车键加入了缓冲区,scanf此时把回车键接受了,b的值就是回车键,回车键的ASCII值:10。

    这就是常说的scanf会吃回车键!!!

    如下例子吃空格是不是更明显一点

    TestCode2

    那么这样就会导致我们得不到我们自己需要输入的b值,此时就用到了fflush(stdin)。

    测试环境VS2013(fflush在vs2019上面存在问题)

    TestCode3:

    #include <stdio.h>
    int main()
    {
        int a;
        char b;
        scanf_s("%d", &a);
        fflush(stdin);
        scanf_s("%c", &b);
        printf("a=%d\n", a);
        printf("b=%d\n", b);
        return 0;
    }

    分析:这次当输入1的时候,不会直接输出a,b的值,因为输入1后,我们利用fflush把缓冲区清空,相当于把回车键在缓冲区里面清空,此时需要输入东西,就走到了第二个scanf_s需要继续输入东西,我们输入2,此时就输出了2的ASCII值:50.

    二、fflush(stdout)使用过程和分析过程如下:

    作用:调用printf()时,输出的结果一般会被标准库缓存起来,可能不会及时打印写出到输出设备上面,此时就可以用fflush(stdout)强制把缓存内容进行输出。

    eg环境(VS2013):

    TestCode4:

    分析:

    不加fflush(stdout)和加上fflush(stdout)打印一样,但是其实本质上面他们显示过程不一样。

    不加fflush(stdout):调用了printf后,把1,2,3,4,5值都放到了输出缓冲区里,最后一次性进行了显示。

    加了fflush(stdout):调用了printf后,把1,2,3,4,5值每次放一个就输出一个,相当于着5个值从输出缓冲区一个一个蹦出来的。只是人眼看起来打印一样。

    这样看起来不明显,其实当出现多进程的时候,这种情况就有可能发生,比如调用fork()的时候,子进程没有退出,父进程不能及时输出需要的内容。

    eg:(linux环境)

    #include<stdio.h>
    #include<unistd.h>
    
    int main()
    {
    
        //TODO
        int a = 10;
        printf("a = %d", a);
        fflush(stdout);
        fork();
        //TODO
        return 0;
    }

    此时就可以为了让父进程需要输出a的时候及时输出a。

    展开全文
  • gcc下fflush失效

    2020-11-27 21:01:34
    今天编译一程序涉及到了键盘缓冲区的清除问题,在VC下完全没问题的代码却不能在gcc下运行成功,作此笔记以留念: VC下代码: #include<stdio.h> void main() ... fflush(stdin); printf("Input arit

    今天编译一程序涉及到了键盘缓冲区的清除问题,在VC下完全没问题的代码却不能在gcc下运行成功,作此笔记以留念:
    VC下代码:
    #include<stdio.h>
    void main()
    {
    float a,b;
    int tag=0;
    char ch;
    float result;

        printf("Input two number:"); 
        scanf("%f%f",&a,&b); 
        fflush(stdin); 
        printf("Input arithmetic lable(+-*/):"); 
        scanf("%c",&ch); 
    
    
        switch (ch) 
        { 
                case '+':result=a+b;break; 
                case '-':result=a-b;break; 
                case '*':result=a*b;break; 
                case '/':if(!b) 
                         { 
                                 printf("divisor is zero!\n"); 
                                 tag=1; 
                         } 
                         else 
                                 result=a/b; 
                         break; 
                default:printf("illegal arithmetic lable\n"); 
                        tag=1; 
        } 
        if(!tag) 
                printf("%.2f %c %.2f=%.2f\n",a,ch,b,result); 
    

    }

    一网友的解释如下:

    如何清除stdin缓存中的数据?

    一。这问题没有什么很标准的做法:
    方法1、fflush(): VC上面使用fflush()可以成功, 而在gcc上面使用fflush()却不能成功。
    方法2、setbuf(): 虽然在gcc上面,使用这种方式确实可以清空输入流. 但不建议使用。
    方法3、通过 while 循环把输入流中的余留数据“吃”掉:
    int c;
    while ((c=getchar()) != ‘\n’ && c != EOF);

        /*可直接将这2句代码当成fflush(stdin)的替代,直接运行可清除输入缓存流*/
    

    二。解释:

    1. fflush()不行的原因如下:

    C-FAQ中如下:
    Question 12.26
    How can I flush pending input so that a user’s typeahead isn’t read at the next prompt? Will fflush(stdin) work?


    fflush is defined only for output streams. Since its definition of ``flush’’ is to complete the writing of buffered characters (not to discard them), discarding unread input would not be an analogous meaning for fflush on input streams.

    There is no standard way to discard unread characters from a stdio input stream, nor would such a way be sufficient unread characters can also accumulate in other, OS-level input buffers.

    C标准(ISO/IEC 9899:1999 standard)规定fflush(stdin)操作是未定义的<参看《ISO/IEC 9899:1999 standard》p270>;。也就是说不一定能实现刷新功能,但有的编译器可能不遵循标准,对fflush(stdin)操作不予警告,并且有时可能产生正确的结果,但最好不要这样使用。
    VC上面使用fflush()可以成功, 而在gcc上面使用fflush()却不能成功。

    以下是 C99 对 fflush 函数的定义:

    int fflush(FILE *stream);
    如果 stream 指向输出流或者更新流(update stream),
    并且这个更新流最近执行的操作不是输入,
    那么 fflush 函数将把这个流中任何待写数据传送至宿主环境(host environment)写入文件。

    否则,它的行为是未定义的。对于fflush(FILE *out)这种是肯定会成功的,但是对于fflush(stdin),fflush(stdout),不能保证一定能刷新。

    原文如下:
    int fflush(FILE *stream);
    If stream points to an output stream or an update stream in which
    the most recent operation was not input, the fflush function causes
    any unwritten data for that stream to be delivered to the host environment
    to be written to the file; otherwise, the behavior is undefined.

    其中,宿主环境可以理解为操作系统或内核等。

    由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。

    1. setbuf()的方法也是不符合标准的. 虽然在有些场合它通过将输入设置为无缓冲形式, 以此来刷新输入流, 但是不太可靠。
      虽然在gcc上面,使用这种方式确实可以清空输入流. 但不建议使用.

    其编译后不能运行成功的主要原因在于gcc下fflush(stdin)没起作用,所以
    printf(“Input two number:”);
    scanf("%f%f",&a,&b);
    fflush(stdin);
    printf(“Input arithmetic lable(±/)😊;
    scanf("%c",&ch);
    可以改为:
    printf(“Input two number:”);
    scanf("%f%f",&a,&b);
    printf("Input arithmetic lable(±
    /):”);
    scanf(" “);
    scanf(”%c",&ch);
    这样在gcc下即可编译执行成功,不足之处望指正共同进步。。。。。

    展开全文
  • Linux fflush 函数

    2020-08-09 22:13:44
    int fflush(FILE *stream); 冲洗该缓冲区,即进行同步 二、实例 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **args) { printf("hotice0"); ...

    一、函数声明

    #include <stdio.h>
    int fflush(FILE *stream);
    

    冲洗该缓冲区,即进行同步

    二、实例

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char **args)
    {
        printf("hotice0");
        sleep(3);
        
        printf("hotice0");
        fflush(stdout);
        sleep(3);
        return EXIT_SUCCESS;
    }
    

    两个hotice0会同时显示出来。第一个和第二个都是因为fflush而冲洗。【因为终端是行缓冲】

    更多关于标准IO的缓冲区可以看我的这篇文章:Linux setbuf/setvbuf 函数

    展开全文
  • fflush

    2017-07-20 14:32:49
    概述编辑函数名: fflush功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时头文件:stdio.h原型:int fflush(FILE *stream)其中stream是要冲洗的流 函数说明编辑fflush()会强迫将缓冲区内的数据...
  • C语言fflush方法

    千次阅读 多人点赞 2019-07-09 16:54:57
    函数名: fflush 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件:stdio.h 原型:int fflush(FILE *stream) 其中stream是要冲洗的流 fflush(stdin)刷新标准输入缓冲区,把输入缓冲区...
  • fflush函数 函数原型 #include <stdio.h> int fflush(FILE *stream); 参数 FILE *stream — 文件指针 作用 用来清空文件缓冲区 两个特殊参数 stdout : standard output 的缩写,即标准输出,一般是指显示器;...
  • C语言中fflush()、fflush(stdin)、fflush(stdout)

    千次阅读 多人点赞 2019-01-03 19:15:26
    fflush()不是标准库文件,经笔者测试,VC6.0完美支持,GCC(GCC4.6.2)不支持。 fflush()用于清空文件缓冲区,如果文件是以写的方式打开 的,则把缓冲区内容写入文件。其原型为:  int fflush(FILE* stream); ...
  • fflush()函数总结

    2019-10-08 13:13:41
    函数名: fflush() 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件: stdio.h 原型: int fflush(FILE *stream),其中stream是要冲洗的流 2. 函数说明 fflush()会强迫将缓冲区内的数据...
  • 简单C++类: void My_Log::Write_Log(const char *szFormat, ...) { FILE *hf = NULL; va_list ap; if(!szLogFile[0]) return; hf = fopen(szLogFile, "a");... fflush(hf); fclose(hf); }
  • 1. 库函数fflush原型 1 2. FILE结构体 1 3. fflush函数实现 2 4. fclose函数实现 4 附1:强弱函数名 5 附2:属性__visibility__ 6 库函数fflush原型 先瞧瞧fflush的原型: #include <stdio.h> ...
  • Linux -- fflush函数

    千次阅读 2019-08-07 17:21:19
    函数名:fflush - 刷新一个流 概要: #include <stdio.h> int fflush(FILE *stream); 描述:   对于输出流,fflush()通过流的底层write(2)函数对所有用户空间缓存的数据进行强制写操作,写到所给定...
  • 理解:fflush(stdin)和fflush(stdout)和rewind(stdin) 小结论(多谢网友zhao4zhong1为我解答疑难): 1、在每个最后不带\n的printf后面加fflush(stdout);(对标准输出流进行清理,但是它并不是把数据丢掉,而是及时地...
  • fflush 和 fsync 的区别

    2019-09-28 21:35:19
    int fflush(FILE *stream);If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream t...
  • 关于fflush(stderr);

    2021-04-30 00:06:41
    stdout:标准输出设备 stderr:标准错误输出设备 ...fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。 fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。 ...
  • 相关参考链接: ... 在linux命令行中执行manfflush即可。 我的本意是想弄明白fflush()函数是数据的写入目的... Note that fflush() only flushes the user-space buffers provided by the C library. To ensure tha...
  • 不论从 字面意思 还是 某些技术文档 中,都可以看到 fflush(stdin) 是对标准输入缓冲区清空的标准方案; 然而,并不是! 深入了解一下 fflush(stdin) 之后,才发现这个锅得自己背,怪自己喜欢拿来就用,不去深入了解...
  • setbuf与fflush

    2018-09-02 14:39:43
    语句将通知输入/输出库,所有写入到stdout的输出都应该使用buf作为输出缓冲区,直到buf缓冲区被填满或者程序员直接调用fflush(注:对于由写操作打开的文件,调用fflush将导致输出缓冲区的内容被实际地写入该文件)...
  • python fflush 刷新流

    2020-04-08 22:59:34
    后台运行python程序,想保存其打印信息,通常采用如下方式: nohup ...(C语言通常采用fflush(stdout);函数来实现) python中调用如下所示方法即可达到这一目的。 import sys sys.stdout.flush() #刷新标准输出缓冲区
  • 为什么fflush(stdin)用了并不能清除缓冲区 很多人在教材上都看到fflush(stdin)这个函数的使用,教材给出的解释是清除缓冲区,可是一些动手实践过代码的小伙伴发现,fflush(stdin)这个函数并没有起到清除缓冲区的作用...
  • fsync与fflush的关系和区别

    千次阅读 2020-04-04 23:04:33
    read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync: linux底层操作; 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。 fread/fwrite/fflush: ...
  • man fflush

    2021-07-30 19:17:32
    fflush – 冲刷流 概要 #include <stdio.h> int fflush(FILE *stream); 说明 对于输出流来说,fflush强制写所有用户空间缓冲的数据,或者通过流的底层写函 数更新流。 对于跟可做位置偏移操作...
  • 在多线程中调用setvbuf 与 fflush(stdout) 可能会导致死锁, 项目中多次调用了setvbuf,频繁调用了fflush(stdout),出现的情况为死锁。 修改为setvbuf在程序启动时候,调用一次。
  • c语言demo,监听键盘是否有输入,有...fflush()可以清空输入缓冲区,但是不能清空键盘缓冲区的数据,通过下面的代码可证 #include <Windows.h> #include <stdio.h> #include <conio.h> int ...
  • fflush(stdin)与fflush(stdout) 1.fflush(stdin): 作用:清理标准输入流,把多余的未被保存的数据丢掉。。 如: int main() { int num; char str[10]; cin>>num; cout<<num<<endl; cin...
  • fflush(stdin)与fflush(stdout) fflush函数广泛应用在多线程,网络编程的消息处理中。 fflush(stdin) 作用 清理标准输入流,把多余的未被保存的数据丢掉。(程序的健壮性) 一般用在输入之前,例如 fflush(stdin); ...
  •  stderr,和stdout重要的一点区别,stderr是没有缓冲的,它立即输出,而stdout默认是行缓冲,也就是它遇到‘\n’,才向外输出内容,如果你想stdout也实时输出内容,那就在输出语句后加上fflush(stdout),这样就能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,173
精华内容 16,069
关键字:

fflush