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


         

Хрестоматия по программированию на Си в Unix- часть 162


- 162 - Си в UNIX

char buffer[256]; /* Буфер для чтения строк */

/* Разметка массива адресов начал строк */ void getSeeks(){ int c; offsets[0] =0L; while((c = getc(fp)) != EOF) if(c =='\n') /* Конец строки - начало новой */ offsets[++nlines] = ftell(fp);

/* Если последняя строка файла не имеет \n на конце, */ /* но не пуста, то ее все равно надо посчитать */ if(ftell(fp) != offsets[nlines]) nlines++; printf( "%d строк в файле\n", nlines); } char *getLine(n){ /* Прочесть строку номер n */ fseek(fp, offsets[n], 0); return fgets(buffer, sizeof buffer, fp); }

void main(){ /* печать файла задом-наперед */ int i; fp = fopen("INPUT", "r"); getSeeks(); for( i=nlines-1; i>=0; --i) printf( "%3d:%s", i, getLine(i)); }

4.40. Что будет выдано на экран в результате выполнения программы?

#include <stdio.h> main(){ printf( "Hello, " ); printf( "sunny " ); write( 1, "world", 5 ); }

Ответ: очень хочется ответить, что будет напечатано "Hello, sunny world", поскольку printf выводит в канал stdout, связанный с дескриптором 1, а дескриптор 1 связан по- умолчанию с терминалом. Увы, эта догадка верна лишь отчасти! Будет напечатано "worldHello, sunny ". Это происходит потому, что вывод при помощи функции printf

буферизован, а при помощи сисвызова write - нет. printf помещает строку сначала в буфер канала stdout, затем write выдает свое сообщение непосредственно на экран, затем по окончании программы буфер выталкивается на экран. Чтобы получить правильный эффект, следует перед write() написать вызов явного выталкивания буфера канала stdout:

fflush( stdout );

Еще одно возможное решение - отмена буферизации канала stdout: перед первым printf

можно написать

setbuf(stdout, NULL);

Имейте в виду, что канал вывода сообщений об ошибках stderr не буферизован исходно, поэтому выдаваемые в него сообщения печатаются немедленно. Мораль: надо быть очень осторожным при смешанном использовании буферизованного и небуферизованного обмена.




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