Главная страница
Навигация по странице:

  • FILE * fopen (const char *filename, const char * mode) errno_t fopen_s(FILE** pFile, const char *filename, const char *mode);

  • Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)


    Скачать 319.62 Kb.
    НазваниеЛекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
    Дата11.01.2022
    Размер319.62 Kb.
    Формат файлаdocx
    Имя файлаLecture_Programming_2021_09_01.docx
    ТипЛекции
    #328427
    страница20 из 36
    1   ...   16   17   18   19   20   21   22   23   ...   36

    Работа с файлами

    1. Общие приёмы работы с файлами


    Программа, которая не сохраняет результаты своей работы, очевидно, не очень-то и нужна. Мы научимся создавать файлы, записывать в них информацию, и затем считывать ее обратно в программу. В стандартной библиотеке языка Си предусмотрены функции для работы с файлами. Для работы с ними необходимо подключить заголовочный файл <stdio.h>.

    Работа с файлами складывается из трех шагов:

    • открыть файл;

    • работать с файлом;

    • закрыть файл.

    Рассмотрим эти шаги подробнее.

    1. Файл открывается. Это означает, что программа "захватывает" заданный по имени файл, сообщает операционной системе, что далее она будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда несколько программ одновременно хотят записывать информацию в один и тот же файл. Правда, считывать данные из файла, очевидно, допустимо одновременно множеством программ, поэтому в операции открытия файла обычно уточняется, что файл открывается "на чтение" (считывание информации, которая не меняется) либо "на запись" (данные в файле модифицируются).

    Функция открытия файла имеет следующий прототип (здесь и далее пропущены некоторые платформенные особенности прототипов):

    FILE * fopen (const char *filename, const char * mode)

    errno_t fopen_s(FILE** pFile, const char *filename, const char *mode);

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

    Параметров у функции fopen() два. Первый – это путь к файлу (строка), второй -- параметры открытия файла. Используются следующие способы открытия файла:

    режим

    описание

    начинает с..

    r

    rb




    открывает для чтения

    начала

    w

    wb




    открывает для записи (создаёт файл в случае его отсутствия). Удаляет содержимое и перезаписывает файл.

    начала

    a

    ab




    открывает для добавления (создаёт файл в случае его отсутствия)

    конца

    r+

    rb+

    r+b

    открывает для чтения и записи

    начала

    w+

    wb+

    w+b

    открывает для чтения и записи. Удаляет содержимое и перезаписывает файл.

    начала

    a+

    ab+

    a+b

    открывает для чтения и записи (добавляет в случае существования файла)

    конца


    2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются. Приёмы работы с файлом зависят от типа контента файла и будут рассмотрены далее.
    3. Файл закрывается. После этой операции он снова доступен другим программам для обработки.

    Функция закрытия файла имеет следующий прототип:

    int fclose (FILE *stream);

    int _fcloseall( void );

    При вызове функции fclose нужно передать указатель на дескриптор ранее открытого файла. Вызов функции fclose приводит к закрытию потока данных, на который указывает аргумент stream, сбросу остаточного содержимого буфера данных в файл (если в буфере оставались данные), освобождению памяти выделенной под буфера чтения и записи (если буфера создавались) и закрытию файла связанного с потоком данных. В случае успешной работы функция возвращает 0. Если во время работы функции возникла ошибка, то она возвращает EOF (-1), при этом в дескриптор файла будет присвоен код ошибки, которую затем можно определить, используя функцию ferror.

    Вот список некоторых дополнительных полезных функций для работы с файлами:

    int feof (FILE *stream); //проверка достижения конца файла

    int fseek(FILE *stream, long offset, int origin); //позиционирование

    int ferror(FILE *stream); // возвращает текущий код ошибки

    void clearerr (FILE* stream); // сбрасывает признак ошибки в 0

    // записывает в pposition текущую позицию курсора в файле

    int fgetpos(FILE* stream, fpos_t* pposition);

    // устанавливает курсор в файле в позицию из pposition

    int fsetpos (FILE*stream, const fpos_t* pposition);

      1. 1   ...   16   17   18   19   20   21   22   23   ...   36


    написать администратору сайта