c - 即时将缓冲区写入标准输出

标签 c buffer

可以一次将一大块文本写入标准输出。

例如,我得到一个 50kb 的文本文件并将其放入 Story.txt 中。我很好奇是否可以将此文件的内容转储到标准输出中,而用户不会注意到任何文本慢慢进入。一会儿还没有文本,接下来整个缓冲区都被刷新到标准输出中。

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

/* 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;
}

重新打开部分是我想知道如果我在打开标准输出后立即调用 setvbuf/flush 是否会有不同的行为。不幸的是它什么也没做。

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

最佳答案

我使用的是 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.

在打印最后一行之前,我确实注意到有那么轻微的犹豫,该点之前的所有行几乎都是瞬时的。

关于c - 即时将缓冲区写入标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35930608/

相关文章:

Python 结构元素作为数组

OpenGL:VAO 和 VBO 是否适用于大型多边形渲染任务?

Android MediaPlayer 在 API 21 上失败(但不是 API 19 或 22!)

python - (result, consumed) = self._buffer_decode(data, self.errors, final) 错误

编译linux内核模块show_mem例程

c - 函数不返回数组值

c# - FileSystemWatcher.Filter - 在缓冲区之前还是之后?

c - 内存、缓冲区和堆栈有什么区别?

c - 使用 memset() 将动态分配的结构初始化为全 0 是一个好习惯吗?如果是,有什么好处?

在 c (gcc) centos 7 中实现的 unix 域套接字中的连接错误