Ввод/вывод файлов в языке C. Основные функции для работы с файлами (окончание)

   
На этом шаге мы закончим перечисление функций, предназначенных для работы с файлами.

   
Продолжим перечисление функций.

  • Функция rewind (). Формат:
      rewind (fp);
    

    Устанавливает указатель позиционирования в файле с указателем fp начало потока. Функция rewind (fp) эквивалентна
    функции fseek(fp, 0L, SEEK_SET) за исключением того, что rewind() сбрасывает индикатор конца файла
    и индикаторы ошибок, a fseek() сбрасывает только индикатор конца файла. После функции rewind() можно
    выполнять операцию обновления для файлов, открытых для обновления. Возвращаемого значения нет.

  • Функция ferror (). Формат:
      ferror (fp);
    

    Функция тестирует поток на ошибки чтения/записи. Если индикатор ошибки устанавливается, то он остается в таком положении,
    пока не будут вызваны функции clearerr() или rewind(), или до того момента, пока поток не закроется.
    Если в файле была обнаружена ошибка, функция ferror() возвращает ненулевое значение.

  • Функция freopen (). Формат:
      FILE *freopen (const char *FILEname, const char *mode, FILE ostream);
    

    Функция freopen() подставляет файл, заданный в первом параметре, вместо уже открытого потока. Она закрывает
    поток независимо от того, открыт ли он. Эта функция полезна для замены файла, связанного со стандартными устройствами
    ввода/вывода: stdin, stdout или stderr. Способы открытия файла аналогичны таким же в функции
    fopen(). При успешном завершении функция возвращает указатель типа FILE (как и функция fopen()), при неудачном - NULL.

       
    Приведем пример перенаправления потока с помощью функции freopen().

    // перенаправление стандартного вывода в файл 
    if (freopen( "OUTPUT.FIL", "w", stdout) == NULL) 
      fprintf (stderr, "Ошибка в переопределении stdout\n");
    // этот вывод пойдет уже в файл 
    printf ("Вывод в файл.");
    // закрытие стандартного потока
    fclose (stdout);
    
  • Функция feof (). Формат:
      feof (fp);
    

    Обнаруживает конец файла с указателем fp: тестирует поток на возникновение индикатора конца файла (который
    наступает после прочтения последней записи). Как только индикатор установлен, операции чтения файла возвращают индикатор
    до тех пор, пока не выполнена функция rewind() - "перемотка" в начало файла или пока файл не будет закрыт.
    Индикатор конца файла переустанавливается с каждой операцией ввода. Функция возвращает ненулевую величину, если
    индикатор конца файла был обнаружен при последней операции чтения, в противном случае - ноль.

  • Функция ferror (). Формат:
      ferror (fp);
    

    Здесь fp - указатель файла (FILE *fp;). Функция выдает ненулевое значение, если операция с файловым потоком
    завершается с ошибкой (например, возникает ошибка чтения файла). Для обработки ошибок ввода/вывода следует записать
    эту функцию перед блоком работы с файлом в виде:

      if (ferror(fp)) 
        {команды обработки ошибок ввода/вывода}
    

    Как только произойдет ошибка, выполнится эта функция и начнут работать команды обработки ошибок.

  • Функция exit(). Формат:
      exit (int status);
    

    Эта функция используется для срочного завершения работы программы при обработке ошибок открытия файла (и не
    только для этого, а для прерывания работы программы по каким-либо другим причинам). Но перед завершением все
    файлы закрываются, остатки данных, находящиеся буфере вывода, записываются в память и вызываются функции обработки
    ошибок, предварительно зарегистрированные специальной функц atexit().

       
    Эти функции обработки ошибок надо самому написать и зарегистрировать их с помощью вызова функции 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. Результат работы приложения

   
На следующем шаге мы рассмотрим стандартный ввод/вывод.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий