Понятие текстовых и бинарных файлов. Как создаются текстовые и бинарные файлы в стиле языка С
Прошлый вопрос посмотреть
Функции ввода - вывода языка С для обработки текстовых файлов: синтаксис, семантика. Примеры посимвольной обработки текстовых файлов
Функции ввода - вывода для обработки текстовых файлов:
intfscanf (FILE *stream, форматная строка, список аргументов);
intfprintf (FILE *stream, форматная строка, список аргументов);
intfgetс(FILE *stream)
intfputс(char с, FILE *stream)
char *fgets(char *s, int size, FILE *stream)
intfputs(char *s, FILE *stream)
Рассмотрим основные варианты обработки текстовых файлов.
При работе с текстовыми файлами возможна их посимвольная или построчная обработка.
Функции fprintf() и fscanf() , fgetc() и fputc() используют для посимвольной обработки, а функции fgets() и fputs() для построчной обработки текстовых файлов.
Функции ввода-вывода fprintf() и fscanf() работают аналогчно функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток.
Функция fgetc () считывает символ из файла, открытого функцией fopen() в режиме чтения. Параметр stream является указателем на поток, возвращенным функцией fopen(). Функция fgetc() возвращает целочисленную переменную, младший байт которой содержит введенный символ. Если возникла ошибка, старший байт этой переменной равен нулю. Если при чтении обнаруживается конец файла, функция fgetc() возвращает константу EOF.
Функция fputc() записывает символ в файл, открытый с помощью функции fopen(). Параметр stream представляет собой указатель файла, возвращенный функцией fopen(), а аргумент является символом, подлежащим выводу. Указатель stream сообщает функции putc(), в какой именно файл следует произвести запись. Несмотря на то, что параметр имеет тип int, в файл записывается лишь младший байт. Если функция fputc() выполнена успешно, она возвращает символ, записанный ею в файл. В противном случае она возвращает константу EOF.
30. Функции ввода - вывода языка С для обработки бинарных файлов: синтаксис, семантика, примеры использования
Способ хранения данных в бинарных (двоичных) файлах имеет два важных преимущества:
-Увеличивается скорость извлечения из файла данных, не носящих чисто текстового характера, так как не требуется действий по преобразованию их из текстового формата в двоичный.
-Имеет место экономия памяти и дискового пространства, поскольку двоичная кодировка более компактна и нет необходимости в использовании управляющих символов.
Принципиально обработка двоичных файлов не очень сильно отличается от обработки текстовых файлов. В любом случае, прежде чем работать с файлом, следует открыть файл, указав режим доступа. Открыть файл для двоичной обработки можно посредством вызова функции fopen(), но ко всем режимам доступа добавляют строчную латинскую букву b. Режимы доступа одинаковы для текстовых и двоичных файлов. Если после вызова функции fopen() указатель на файловый поток f не равен нулю, его можно использовать в последующих обращениях к функциям работы с двоичными файлами, таким, как fwrite() и fread() . Закрывают двоичные файлы, как и текстовые, функцией fclose().
Функции fwrite() и fread() так же могут быть использованы для работы с текстовыми файлами, хотя чаще их используют для работы с бинарными файлами. Параметры функций:
-ptr – указатель на исходные данные, читаемые из файла (записываемые в файл);
-size – размер в байтах одного элемента данных;
Замечание. size_t – специальный идентификатор типа, который введен для обозначения типа результата, вычисляемого операцией sizeof. На самом деле идентификатор size_t является синонимом unsignedint.
-n – число записываемых в файл элементов данных; stream – указатель на файловый поток.
Существует два способа доступа к элементам двоичных файлов: последовательный и произвольный.
31. Произвольный доступ к элементам двоичных файлов в языке С: синтаксис используемых функций, примеры
Организация произвольного доступа к компонентам файла позволяет считывать значения из любой позиции в файле, а также записывать новую информацию в любое место в файле. Но к файлам с произвольным доступом предъявляется одно жесткое требование: их компоненты должны иметь одинаковую длину. Двоичные файлы позволяют обеспечить удовлетворение этого требования. О том, чтобы данные, которые будут находиться в файле произвольного доступа, имели одинаковый размер, следует позаботиться в момент создания файла.
Вспомним о том, что первичная запись в файл возможна только в режиме последовательного доступа.
Для организации произвольного доступа к элементам файла используют функцию fseek(), прототип которой описан в заголовочном файле stdio.h.
Функция fseek() перемещает внутренний указатель файлового потока, изменяя таким образом место в файле, с которого начинается следующая операция чтения или записи. В случае успешного завершения функция возвращает 0, в случае ошибки – ненулевое значение.
Параметры функции:
a. FILE *stream– указатель на открытый файловый поток;
b. longoffset– число байтов, на которое нужно переместить файловый указатель в направлении, указанном параметром whence. Для перемещения файлового указателя в обратном направлении (в сторону начала файла) следует устанавливать offsetравным отрицательному значению;
c.intwhence– указывает положение точки отсчета файлового указателя, от которой будет происходить его перемещение Значения аргумента whence представлены в таблице.
При использовании функции fseek() следует соблюдать осторожность, так как попадание за пределы файла чаще всего не приводит к генерации ошибки, поэтому программисту самому следует принимать меры для предотвращения обращения к диску за пределами известных границ файла
32. Как организуется работа с файлами и потоками в стиле языка С++ (на примере текстовых
файлов)
В С++ для работы с файлами используются специальные потоки. Ресурсы работы с файловыми потоками находятся в заголовочном файле fstream.h.
В С++ используется три класса потоков: ввода, вывода и ввода-вывода.
После объявления потока его связывают с файлом с помощью функции open().
При вызове функции open() используется конструкция составного имени, так как функция open() является методом класса ios.
Можно производить связывание потока с именем файла сразу при его определении. При этом сразу после имени потока указывается список фактических параметров.
Закрытие файлового потока выполняется с помощью встроенной функции close().
При вызове функции close() используется конструкция составного имени, так как функция close() является методом класса ios.
Ввод и вывод данных из (в) файла производится соответственно с помощью операторов извлечения (>>) и передачи данных в поток (<<).
Синтаксис чтения данных из файла аналогичен потоку cin. Синтаксис вывода данных в файл аналогичен потоку cout.
Замечание: Если в текстовом файле хранятся числовые значения, то после последнего числа не должно быть пробелов, символов табуляции и конца строки.
Синтаксис определения файлового потока для вывода данных в заданный файл :
Ø ofstreamимя_потока(имя_файла,ios::out);
Синтаксис определения файлового потока для ввода данных из заданного файла :
Ø ifstreamимя_потока(имя_файла,ios::in);
Синтаксис определения файлового потока для добавления данных в конец файла :
Ø ofstreamимя_потока(имя_файла,ios::app);
Синтаксис чтения данных из файла:
Ø Файловый_поток>>имена_переменных;
Синтаксис вывода данных в файл:
Ø Файловый_поток<<выводимые_данные;