即时写入缓冲区到stdout

时间:2016-03-11 01:26:42

标签: c buffer

可以一次性将大块文本写入stdout。

例如,我得到一个50kb的文本文件并将其放入story.txt。我很好奇,如果我可以将此文件的内容转储到stdout而没有用户注意到任何文本慢慢进入。有一刻没有文本,接下来整个缓冲区被刷新到stdout。

我尝试使用以下代码执行此操作,但无论我设置了什么缓冲模式,它都无法一次性写入文件,只能部分编写。

/* dumps a lot of text at once */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>

char story[100000];
char buffer[100000];

int main(int argc, char **argv)
{
    FILE *handle = fopen("coolstory.txt", "r");
    size_t n = fread(&story[0], 1, 100000, handle);
    fclose(handle);

    /* try to flush all at once... */
    fclose(stdout);
    freopen("/dev/tty", "w", stdout);
    setvbuf(stdout, &buffer[0], _IOFBF, 100000);
    fwrite(story, n, 1, stdout);
    fflush(stdout);

    printf("\nread %u bytes.\n", n);

    return 0;
}

重新打开的部分让我想知道如果我在stdout打开后立即调用setvbuf / flush会有不同的行为。不幸的是它没有做任何事情。

我只是想知道是否可能,如果没有,为什么。

1 个答案:

答案 0 :(得分:0)

我在ubuntu linux 14.04上。

注意:#include未使用的头文件通常是个坏主意。

我运行了此版本的代码:

/* dumps a lot of text at once */
//#include <unistd.h>
#include <stdio.h>
//#include <stdlib.h>
//#include <fcntl.h>
//#include <string.h>

char story[100000];


int main( void )
{
    FILE *handle = fopen("value_chainLength.txt", "r");
    size_t n = fread(story, 1, 100000, handle);
    fclose(handle);


    fwrite(story, n, 1, stdout);
    fflush(stdout);

    printf("\nread %lu bytes.\n", (long unsigned)n);

    return 0;
}

在46550749字节文本文件

输出在终端上完成的速度几乎和我按下的一样快,然后释放“输入”。键。

最后一行输出是:

read 100000 bytes.

我确实注意到在打印最后一行之前犹豫不决,在此之前的所有行几乎都是瞬间的。