C 对标准输出的即时写入缓冲区

C 对标准输出的即时写入缓冲区,c,buffer,C,Buffer,可以同时将一大块文本写入标准输出 例如,我得到一个50kb的文本文件并将其放入story.txt。我很好奇,我是否可以将此文件的内容转储到stdout中,而不让用户注意到任何缓慢输入的文本。一会儿没有文本,然后整个缓冲区被刷新到标准输出中 我试着用下面的代码来写,但不管我设置了什么缓冲模式,它都无法一次完成文件的编写,只能部分完成 /* dumps a lot of text at once */ #include <unistd.h> #include <stdio.h>

可以同时将一大块文本写入标准输出

例如,我得到一个50kb的文本文件并将其放入story.txt。我很好奇,我是否可以将此文件的内容转储到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;
}
/*一次转储大量文本*/
#包括
#包括
#包括
#包括
#包括
char story[100000];
字符缓冲区[100000];
int main(int argc,字符**argv)
{
FILE*handle=fopen(“coolstory.txt”、“r”);
大小n=fread(&story[0],100000,句柄);
fclose(手柄);
/*试着一次冲掉所有的水*/
fclose(stdout);
freopen(“/dev/tty”,“w”,stdout);
setvbuf(标准输出和缓冲区[0],_IOFBF,100000);
fwrite(故事,n,1,stdout);
fflush(stdout);
printf(“\n读取%u字节。\n”,n);
返回0;
}
重新打开部分让我想知道,如果在stdout打开后立即调用setvbuf/flush,它们的行为是否会有所不同。不幸的是,它什么也没做


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

我使用的是ubuntu linux 14.04

注意:包含未使用的头文件通常不是一个好主意

我运行了以下版本的代码:

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

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

控制台I/O通常很慢,因为它需要呈现并对用户可见。如果将stdout重定向到一个文件,您可以更快地将其写入
stdout
?有时它似乎是在块中完成的,但可能我弄错了。@Dmitry,try
$cat/usr/include/stdio.h
。在我的机器上,它大约是30KiB,看起来它以144Hz的频率在5帧内完成。我认为使用50KiB不会有太多问题。C规范说“setvbuf函数只能在流指向的流与打开的文件关联之后,并且在流上执行任何其他操作(除了对setvbuf的调用不成功)之前使用”-->so
fclose(stdout);freopen()
可能会违反这一点吗?IDK.@chux这就是我做那个实验的原因。就这个实验而言,我不太在乎“几乎是瞬间的”。我只想画出最后一个屏幕,而且一次画完。也就是说,类似于双缓冲。我认为诅咒可以做到这一点,但我想知道标准c是否可以,或者至少在libc终端函数的帮助下。
read 100000 bytes.