Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабараторная работа 7.doc
Скачиваний:
8
Добавлен:
01.03.2016
Размер:
92.16 Кб
Скачать

Посимвольный ввод

Предполагая, что переменные 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). Заметьте, что при посимвольном вводе-выводе файл трактуется как непрерывный поток данных.

Форматированный ввод-вывод текстового файла

При посимвольном вводе выводе программисту самому приходится заботиться о том, чтобы выделять в потоке символов поля и выполнять требуемые преобразования символьных представлений в двоичные. В ряде случаев это можно выполнить с помощью обсуждаемых в этом разделе функций форматированного ввода-вывода. Вначале рассмотрим форматированный вывод, а затем - форматированный ввод.