- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Функция fclose()
- •Функции чтения-записи
- •Функции fread() и fwrite()
- •Использование fopen(), getc(), putc() и fclose()
- •Запись символа
- •Чтение символа
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Чтение и запись символов
- •Указатель на файл
- •Открытие файла
Использование fopen(), getc(), putc() и fclose()
Функции fopen(), getc(), putc() и fclose() составляют минимальный набор файловых операций.
Запись символа
Система ввода/вывода ANSI С определяет две эквивалентные функции, выводящие символ - putc() и fputc(). (На самом деле putc() реализована в виде макроопределения.) Поддержка двух идентичных функций необходима для сохранения совместимости со старыми версиями С.
Функция putc() используется для записи символов в поток, ранее открытый для записи с помощью функции fopen(). Прототип для putc() следующий: int putc(int ch, FILE *fp); где fp — это указатель на файл, возвращенный fopen(), a ch - выводимый символ. Указатель на файл указывает putc(), в какой файл следует писать. По историческим причинам ch определена как int, но используется только младший бит.
Если putc() выполнена успешно, она возвращает выведенный символ. В противном случае возвращает EOF.
Чтение символа
Имеется две эквивалентные функции, предназначенные для ввода символа - getc() и fgetc(). Поддержка двух идентичных функций необходима для сохранения совместимости со старыми версиями С.
Функция getc() используется для чтения символов из потока, открытого на чтение с помощью fopen(). Прототип getc() следующий: int getc(FILE *fp); где fp - это указатель на файл типа FILE *, возвращенный fopen(). По традиции getc() возвращает целое, но старший байт установлен в 0.
Функция getc() возвращает EOF при достижении конца файла. Для чтения текстового файла до конца следует использовать следующий код: ch = getc(fp); while(ch!=EOF) { ch = getc(fp); }
Создать текстовый файл "new1.txt" записав в него строку из 50 символов. Все символы, отличные от пробела, переписать в новый файл "new2.txt":
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{ char ch, sl[50];
char text[]="one to tree four";
FILE *pf, *pr; // Указатели на файлы
pf=fopen("new1.txt","w"); //Создание нового файла new1.txt
clrscr(); //Экран
fprintf(pf,"%s\n",text); // Запись в файл строки text
fclose(pf); // Закрытие файла pf
pf=fopen("new1.txt","r"); // Открытие файла pf для чтения
pr=fopen("new2.txt","w"); // Создание нового файла new2.txt
while (!feof(pf)) // Пока не конец файла
{ ch=getc(pf); // Чтение символа ch из файла pf
if (ch != ' ')
putc(ch,pr); // Запись в файл pr символа ch
}
fclose(pr); // Закрытие файла pr
rewind(pf); // Возврат указателя на начало файла pf
fgets(sl,50,pf); // Чтение из файла pf строки в переменную sl
printf("%s\n",sl); // Вывод строки sl на дисплей
pr=fopen("new2.txt","r"); // Открытие файла pr для чтения
while (!feof(pr)) // Пока не конец файла pr
{ ch=getc(pr); // Чтение символа из файла pr
putchar(ch); // Вывод символа ch на дисплей
}
fclose(pf); // Закрытие файлов
fclose(pr);
getch();
}
Использование feof()
Как утверждалось ранее, файловая система С может оперировать двоичными данными. Когда файл открыт для двоичного ввода, может быть прочитано целочисленное значение, равное EOF. В результате getc() будет отображать состояние наличия конца файла, хотя физический конец еще не достигнут. Для разрешения данной проблемы в С имеется функция feof(), используемая для определения конца файла при чтении двоичных данных. Она имеет следующий прототип: int feof(FILE *fp); где fp идентифицирует файл. Функция feof() возвращает не 0, если достигнут конец файла, в противном случае она возвращает 0. Следовательно, следующий код читает двоичный файл, пока не встретится метка конца файла: while(!feof(fp)) ch = getc(fp); Данный метод может применяться не только к двоичным, но и к текстовым файлам.
