Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по программированию на С

.pdf
Скачиваний:
52
Добавлен:
01.04.2014
Размер:
1.24 Mб
Скачать

Занятие 86

86.1.Стандартные потоки

Вначале выполнения любой программы, написанной на языке С, автоматически открываются три потока: stdin (стандартный поток ввода), stdout (стандартный поток вывода) и stderr (стандартный поток ошибок). Обычно эти потоки связаны с консолью, однако операционная система может перенаправлять их на другие устройства.

Поскольку стандартные потоки представляют собой указатели файлов, их можно использовать для консольного ввода-вывода. Например, функцию putchar() можно определить таким образом:

int putchar(char с)

{

return putc(c, stdout);

}

Как правило, поток stdin используется для ввода с клавиатуры, а потоки stdout и stderr используются для записи на экран дисплея.

Потоки stdin, stdout и stderr можно применять как файловые указатели в любой функции, использующей указатели типа FILE*. Например, функцию fgets() можно применять для ввода строки с консоли, используя следующий вызов:

fgets(str, 80, stdin);

Фактически такое использование функции fgets() довольно полезно. Как упоминалось ранее, применение функции gets() может привести к переполнению массива, в который записываются символы, поскольку она не предусматривает проверки возможного выхода индекса массива за пределы допустимого диапазона. При использовании потока stdin функция fgets() представляет собой разумную альтернативу, поскольку она выполняет проверку индекса массива и предотвращает его переполнение. Остается лишь одно неудобство: функция fgets(), в отличие от функции gets(), не удаляет из файла символ перехода на новую строку, поэтому его необходимо удалять вручную.

Потоки stdin, stdout и etderr не являются переменными в общепринятом смысле этого слова и им ничего нельзя присвоить с помощью функции fopen(). Кроме того, они открываются и закрываются автоматически, поэтому не следует пытаться их закрывать самостоятельно.

86.3. Связь с консольным вводом-выводом

Между консольным и файловым вводом-выводом существует небольшое различие. Функции консольного ввода-вывода работа-

ют с потоками stdin или stdout. По существу, функции консольного ввода-вывода просто являются специальными версиями своих файловых аналогов и включены в язык лишь для удобства программистов.

Консольный ввод-вывод можно осуществлять с помощью функций файловой системы, а файловые операции ввода-вывода можно выполнять с помощью консольных функций, например функции printf(). Это возможно благодаря тому, что консольные функции ввода-вывода работают с потоками stdin и stdout. Если операционная среда позволяет перенаправлять потоки, потоки stdin и stdout можно связать не с клавиатурой и экраном, а с другими устройствами.

86.3. Перенаправление стандартных потоков

Для перенаправления стандартных потоков можно применять функцию freopen(). Эта функция связывает существующий поток с новым файлом. Таким образом, с ее помощью стандартный поток можно связать с новым файлом. Ее прототип имеет следующий вид:

FILE *freopen( const char *имя_файла, const char *режим, FILE * поток)

Параметр имя_файла является указателем на строку, содержащую имя файла, связанного с заданным потоком. Файл открывается в режиме, заданном параметром режим, который может иметь те же значения, что и параметр режим в функции fopen(). В случае успешного выполнения функция возвращает указатель файла поток,

впротивном случае она возвращает нулевой указатель.

Вследующей программе функция freopen() перенаправляет стандартный поток stdout в файл OUTPUT:

#include <stdio.h> void main(void)

{

char str[80]; freopen("OUTPUT", "w", stdout); printf("Введите строку: "); gets(str);

printf(str);

}

Как правило, перенаправление стандартных потоков с помощью функции freopen() оказывается полезным в особых ситуациях, например, при отладке. Однако этот способ менее эффективен, чем применение функций fread() и fwrite().