2016-03-11 2 views
0

Можно написать большой блок текста в stdout все сразу.Мгновенный буфер записи в stdout

Например, я получаю текстовый файл 50 КБ и помещаю его в файл 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; 
} 

возобновлять часть была мне интересно, если setvbuf/вровень будет вести себя по-другому, если бы я назвал их сразу после того, как был открыт стандартный вывод. К сожалению, он ничего не сделал.

Я просто хочу знать, возможно ли, а если нет, то почему.

+0

Консоль ввода-вывода, как правило, медленный *, потому что * он должен быть визуализирован и видим пользователю. Вы можете намного быстрее записывать в 'stdout', если он перенаправляется в файл. – EOF

+0

Итак, stdout по дизайну должен выписывать каждый персонаж, когда он размывается? Кажется, что это иногда бывает в блоках, но, может быть, я ошибаюсь. – Dmitry

+0

@Dmitry, попробуйте '$ cat/usr/include/stdio.h'. На моей машине это примерно 30KiB, и похоже, что он заканчивается в ~ 5 кадрах на 144 Гц. Я не думаю, что у вас будет много проблем с 50KiB. –

ответ

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 байт

Выход был сделан на терминале почти так же быстро, как я мог нажать и отпустить клавишу «Enter» ,

последняя выходная линия была:

read 100000 bytes. 

Я заметил очень небольшое нерешительность перед печатью последней строки, все строки до этого момента практически мгновенно.

+0

Для целей этого эксперимента мне не очень-то нужно «практически мгновенно». Я хочу, чтобы только последний экран был нарисован, и все сразу. То есть, подобно двойной буферизации. Я думаю, что проклятия могут это сделать, но мне было интересно, сможет ли стандартный c или, по крайней мере, с помощью функций терминала libc. – Dmitry

Смежные вопросы