Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - методичка2.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
403.97 Кб
Скачать

Потоки стандартного ввода-вывода

Каждая Си-программа при исполнении получает уже открытыми пять файлов стандартного ввода-вывода, указатели-константы на которые в виде символических имен стандартных потоков (устройств ввода-вывода) определены в файле stdio.h:

stdin – указатель на входной буфер при вводе с клавиатуры (устройство CON – консоль);

stdout – указатель на выходной буфер при выводе на экран консоли;

stderr – указатель для вывода сообщений на экран консоли ;

stdaux – указатель для связи с дополнительным устройством (AUX, COM1);

stdprn – указатель для вывода на устройство печати (PRN).

Файл stdin открывается для программы только для чтения, файлы stdout, stderr, stdprn – только для записи, файл stdaux – для чтения и записи. Указатели стандартных потоков могут использоваться так же, как указатели на переменную типа FILE для потоков, открытых программистом в программе. Они же используются по умолчанию в стандартных функциях ввода с клавиатуры и вывода на экран.

В файле заголовков stdio.h заданы также константы, используемые при работе с файлами:

NULL – нулевой байт, возвращаемый как NULL-указатель в случае ошибки при открытии файла;

EOF – значение конца файла (–1).

Повторное открытие файла

Закрытый файл можно открыть заново с другим типом доступа. Открытый файл можно повторно открыть и изменить права доступа одной функцией

вида

freopen (“имя_файла“, ”тип_доступа”, указатель_потока) ,

которая закрывает файл, на который ссылается указатель_потока, а затем открывает файл, на спецификацию которого указывает ASCIIZ-строка имя_файла, с новым типом_доступа. В случае успеха функция возвращает указатель на открытый поток, который будет совпадать с указателем_потока, иначе возвращает NULL.

Повторное открытие того же самого файла изменяет права доступа, очищает внутренние буферы и позиционирует указатель записи-чтения либо на начало (r, w, r+, w+), либо на конец (a, a+) файла. Например, в рассмотренном выше примере открытия файла myfile функция

freopen (path, “r”, myfile);

повторно откроет файл с именем, заданным в строке с указателем path, и на который ссылается указатель myfile, с режимом доступа только для чтения.

Если файлы разные, повторное открытие приводит к переадресации потока ввода-вывода. Например, строка программы

freopen (“c:\\file1.tmp ”, “w”, stdout);

выполняет переадресацию стандартного вывода во временный файл c:\file1.tmp.

Позиционирование указателя записи-чтения

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

rewind (fp) , где fp – указатель на открытый файл.

Эта функция устанавливает маркер записи-чтения на начало файла. Файл можно обрабатывать в любом порядке, если передвинуть маркер в нужную позицию функцией вида

Int fseek (указатель_потока, (long) смещение, начало_отсчета),

которая сдвигает маркер записи-чтения файла, на который ссылается указатель_потока, на величину смещения от начала_отсчета. При этом если смещение > 0, то выполняется сдвиг к концу файла, а если смещение < 0 – к началу файла.