可以一次性将大块文本写入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会有不同的行为。不幸的是它没有做任何事情。
我只是想知道是否可能,如果没有,为什么。
答案 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.
我确实注意到在打印最后一行之前犹豫不决,在此之前的所有行几乎都是瞬间的。