可以一次将一大块文本写入标准输出。
例如,我得到一个 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/