- •Лабораторная работа n 7 Обработка текстовых и бинарных файлов
- •Понятие файла
- •Доступ к файлу
- •Посимвольный ввод
- •Форматированный ввод-вывод текстового файла
- •Форматированный вывод (запись в файл)
- •Форматированный ввод (чтение файла)
- •Построчный ввод-вывод
- •Форматированный ввод-вывод бинарного файла
- •Позиционирование в файле
Посимвольный ввод
Предполагая, что переменные fp и ch определены так, как показано ниже, и что функция fopen вызвана должным образом, можно следующим образом воспользоваться функцией fgetcдля чтения отдельных символов файла:
#include <stdio.h> main() { FILE *fp; int ch; . . . .
/* Вызвать функцию fopen для установки указателя fp */ . . ch=fgetc(fp);
. . . . }
При каждом вызове функция fgetc будет выполнять чтение очередного символа файла. Чтение начинается с первого символа файла и прекращается, когда будет обнаружен его конец. В последнем случае функция fgetc возвращает значение EOF (определено в stdio.h) . Так как оно не должно совпадать с допустимыми ASCII-кодами, то нередко директивой #define оно определяется равным -1. По этой причине важно описывать переменную, в которую считывается символ (в нашем случае ch) , как целую, а не символьную.
Некоторые реализации функции fgetc могут возвращать или значение EOF, или другие значения при обнаружении неустранимых ошибок ввода (например, вызванных неисправностью аппаратуры). Чтобы установить, что возвращение EOF действительно соответствует концу файла, надо использовать функцию feof.
В результате вызова
feof(fp)
будет возвращено ненулевое значение ("истина"), если был обнаружен конец файла, и нуль в противном случае.
Чтобы записать отдельный символ в файл, воспользуйтесь вызовом
fputc(ch,fp)
где ch представляет символ, который должен быть записан файл, соответствующий указателю fp. Функция fputc просто последовательно записывает символы в файл.
Еще одна полезная функция посимвольного ввода-вывода позволяет программисту "поместить обратно" символ, только что считанный с помощью функции fgetc. В результате вызова
ungetc(ch,fp)
находящийся в переменной ch символ будет возвращен во входной буфер файла, связанного с указателем fp типа FILE. При следующем вызове функции fgetc этот символ будет считан заново.
Рассмотрим пример использования функций посимвольного ввода-вывода. Следующая программа выделяет из командной строки два имени файла и добавляет содержимое первого файла к концу второго файла:
#include <stdio.h> #include <stdlib.h>
/* Добавить файл 1 к файлу 2 */ int main() { FILE *sp, *tp; char ch if((sp = fopen("1.txt","r")) == NULL) { printf("Ошибка при открытии файла 1.txt\n"); exit(1); } if((tp = fopen("2.txt","a")) == NULL) { printf("Ошибка при открытии файла 2.txt\n"); exit(1); } while((ch = fgetc(sp)) != EOF) { fputc(ch,tp); } fclose(sp); fclose(tp); return 0; }
Обратите внимание на цикл while. Символы по одному читаются из файла источника и записываются в файл приемник до тех пор, пока не будет обнаружен конец файла-источника. В этом случае функция fgetc возвращает целое значение EOF (определенное в файле заголовка stdio.h). Заметьте, что при посимвольном вводе-выводе файл трактуется как непрерывный поток данных.
Форматированный ввод-вывод текстового файла
При посимвольном вводе выводе программисту самому приходится заботиться о том, чтобы выделять в потоке символов поля и выполнять требуемые преобразования символьных представлений в двоичные. В ряде случаев это можно выполнить с помощью обсуждаемых в этом разделе функций форматированного ввода-вывода. Вначале рассмотрим форматированный вывод, а затем - форматированный ввод.