Язык программирования Си


         

Некоторые каналы буферизуются так, что


- 163 - Си в UNIX

Некоторые каналы буферизуются так, что буфер выталкивается не только при запол- нении, но и при поступлении символа '\n' ("построчная буферизация"). Канал stdout

именно таков:

printf("Hello\n");

печатается сразу (т.к. printf выводит в stdout и есть '\n'). Включить такой режим буферизации можно так:

setlinebuf(fp); или в других версиях setvbuf(fp, NULL, _IOLBF, BUFSIZ);

Учтите, что любое изменение способа буферизации должно быть сделано ДО первого обра- щения к каналу!

4.41. Напишите программу, выдающую три звуковых сигнала. Гудок на терминале вызыва- ется выдачей символа '\7' ('\a' по стандарту ANSI). Чтобы гудки звучали раздельно, надо делать паузу после каждого из них. (Учтите, что вывод при помощи printf() и putchar() буферизован, поэтому после выдачи каждого гудка (в буфер) надо вызывать функцию fflush() для сброса буфера). Ответ:

Способ 1: register i; for(i=0; i<3; i++){ putchar( '\7' ); fflush(stdout); sleep(1); /* пауза 1 сек. */ }

Способ 2: register i; for(i=0; i<3; i++){ write(1, "\7", 1 ); sleep(1); }

4.42. Почему задержка не ощущается?

printf( "Пауза..."); sleep ( 5 ); /* ждем 5 сек. */ printf( "продолжаем\n" );

Ответ: из-за буферизации канала stdout. Первая фраза попадает в буфер и, если он не заполнился, не выдается на экран. Дальше программа "молчаливо" ждет 5 секунд. Обе фразы будут выданы уже после задержки! Чтобы первый printf() выдал свою фразу ДО задержки, следует перед функцией sleep() вставить вызов fflush(stdout) для явного выталкивания буфера. Замечание: канал stderr не буферизован, поэтому проблему можно решить и так:

fprintf( stderr, "Пауза..." );

4.43. Еще один пример про буферизацию. Почему программа печатает EOF?

#include <stdio.h> FILE *fwr, *frd; char b[40], *s; int n = 1917; main(){ fwr = fopen( "aFile", "w" );



Содержание  Назад  Вперед