На этом шаге мы закончим перечисление функций, предназначенных для работы с файлами.
Продолжим перечисление функций.
rewind (fp);
ferror (fp);
FILE *freopen (const char *FILEname, const char *mode, FILE ostream);
Приведем пример перенаправления потока с помощью функции freopen().
// перенаправление стандартного вывода в файл if (freopen( "OUTPUT.FIL", "w", stdout) == NULL) fprintf (stderr, "Ошибка в переопределении stdout\n"); // этот вывод пойдет уже в файл printf ("Вывод в файл."); // закрытие стандартного потока fclose (stdout);
feof (fp);
ferror (fp);
if (ferror(fp))
{команды обработки ошибок ввода/вывода}
exit (int status);
Эти функции обработки ошибок надо самому написать и зарегистрировать их с помощью вызова функции atexit().
Для вызова функции atexit() требуется выполнить команду препроцессора #include <stdlib.h>. Каждый вызов atexit() регистрирует новую функцию exit(). Можно зарегистрировать до 32-х функций exit(). Они будут выполняться по принципу работы стековой памяти: "последним вошел / первым вышел" (т. е. последняя зарегистрированная функция будет выполнена первой). Поясним сказанное на примере приведенной ниже программы.
// 83_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <clocale> //обязательно для функции setlocale() using namespace System; //это первая функция exit() void exit_fn1 () { printf("Обращение к первой функции exit\n"); _getch(); } //это вторая функция exit() void exit_fn2 () { printf("Обращение ко второй функции exit\n"); _getch(); } //это основная программа, в которой происходит регистрация //заданных вами функций exit(). Здесь же применяется и сама //функция exit(), которая перед завершением работы программы //станет вызывать зарегистрированные функции, определенные выше void main () { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы // регистрация функции #1 atexit(exit_fn1); // регистрация функции #2 atexit(exit_fn2); _getch(); exit(0); //сначала вызовет функцию #2, т. к. она была зарегистрирована //последней, а затем - функцию #1. После этого программа завершится. }
Какое бы числовое значение вы не подставили вместо аргумента функции, вызов зарегистрированных функций exit() все равно произойдет. Если же не зарегистрирована ни одна функция, то произойдет завершение программы.
Регистрация функций exit() действительна только в пределах одной программы.
Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим стандартный ввод/вывод.