Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Организация посимвольного ввода и вывода

В языке С определены две эквивалентные функции, предназначенные для вывода (записи) символов в файл: putc() и fputc(). Функция putc() записывает символы в открытый ранее файл для записи. Прототип putc имеет вид:

int putc(int ch, FILE *f);

где f — это указатель файла a ch — выводимый символ. В случае если запись выполнилась успешно, то возвращается записанный символ, иначе возвращается EOF.

Ввод (чтение) символа из файла, открытого для чтения, обеспечивается парой функций: getc() и fgetc(). Прототип функции getc():

int getc(FILE *уф);

Функция getc() возвращает целое значение, младший байт которого содержит ASCII-код символа. Старший байт при этом обнулен.

При достижении конца файла, функция getc() возвращает EOF. Пример фрагмента программы чтения символов до конца текстового файла:

do

{ ch = getc(f);

} while(ch!=EOF);

Однако getc() возвращает EOF и в случае ошибки.

Определение конца файла feof()

Как Выше отмечалось при прочтении конца файла функция getc() возвращает EOF. Однако EOF может быть возвращен и в случаях, когда конец файла еще не достигнут. Во-первых, когда файл открывается для двоичного ввода, то прочитанное значение, может совпадать с EOF. При этом программа зафиксирует достижение конца файла, чего на самом деле может и не быть. Во-вторых, функция getc() возвращает EOF и при ошибке ввода, когда недостигнут конец файла. Для решения этой проблемы в С имеется функция feof(), которая определяет, достигнут ли конец файла. Прототип функции feof():

int feof(FILE *f);

Если конец файла достигнут, то feof() возвращает true, иначе нуль. Поэтому следующий код будет читать двоичный файл до тех пор, пока не будет достигнут конец файла:

while(!feof(fp))

{ ch = getc(fp);

if(!feof(in)) printf("%c"ch);

}

Организация ввода и вывода строк

Функции fgets() и fputs() обеспечивают построчный ввод и вывод информации. Первая читает строки символов из файла, а вторая записывает строки в файл. Прототипы этих функций следующие:

int fputs(const char *str, FILE *f);

char *fgets(char *str, int len, FILE *f);

Функция fputs() записывает в поток строку, на которую указывает str. В случае ошибки эта функция возвращает EOF.

Функция fgets() читает из потока строку, до тех пор, пока не будет прочитан символ новой строки или количество прочитанных символов не станет равным len-1. Если был прочитан разделитель строк, он преобразуется в '\0' и записывается в строку. При успешном завершении работы функция возвращает str, а в случае ошибки — пустой указатель (null).

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

char str[60];

FILE *f;

if((fp = fopen("test", "w"))==NULL)

{ printf("Ошибка при открытии файла.\n");

exit(1);

}

do

{ printf("Введите строку (пустую - для выхода):\n");

gets(str); // ввод строки с клавиатуры

if(*str='\0') break; // введена пустая строка

strcat(str, "\n"); // добавление разделителя строк

fputs(str, fp); // запись введенной строки в файл

} while(*str!='\n');