gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:04:05 27 4
gpt4 key购买 nike

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

例如,我得到一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com