обработка данных с помощью функций ввода/вывода

Файлы

 

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

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

Последовательность действий при работе с файлом:

- объявление переменной-указателя на файл с помощью типа FILE *f

Открытие файла с помощью команды fopen(“имя_файла”, тип), где тип – rt, wt, at, rb

обработка данных с помощью функций ввода/вывода

- закрытие файла с помощью команды fclose(указатель на файл)

 

При открытии для каждого файла создается структура, содержащая информацию о файле (имя файла, вид обработки, адрес буфера ввода/вывода и др.) Шаблон такой структуры описан в библиотечном файле stdio.h. Краткое название этого шаблона –FILE. В программе необходимо для каждого файла описать указатель на структуру типа FILE и присвоить значения этим указателям с помощью функции - fopen().

 

Функция fopen() открывает для использования поток, связывает файл с данным потоком и затем возвращает указатель FILE на данный поток. Чаще всего файл рас­сматривается как дисковый файл. Функция fopen() имеет следующий прототип:

FILE *fopen(const char *имя_файла, const char *режим);

Таблица: Допустимые значения режимов
Режим Значение
"r" Открывает файл для чтения. (Открывает по умолчанию как текстовый файл.)
"w" Создает файл для записи. (Открывает по умолчанию как текстовый файл.)
"а" Присоединяет к файлу. (Открывает по умолчанию как текстовый файл.)
"rb" Открывает двоичный файл для чтения.
"wb" Открывает двоичный файл для записи.
"ab" Присоединяет к двоичному файлу.
"r+" Открывает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)
"w+" Создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)
"a+" Присоединяет или создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)
"r+b" Открывает двоичный файл для чтения/записи.
"w+b" Создает двоичный файл для чтения/записи.
"a+b" Присоединяет или создает двоичный файл для чтения/записи.
"rt" Открывает текстовый файл для чтения.
"wt" Создает текстовый файл для записи.
"at" Присоединяет к текстовому файлу.
"r+t" Открывает текстовый файл для чтения.
"w+t" Создает текстовый файл для чтения/записи.
"a+t" Открывает или создает текстовый файл для чтения/записи.

 


Для чтения информации из файла используются функции:

Название функции Описание
int putc(int ch, FILE *fp); Функция putc() используется для записи символов в поток, ранее открытый для записи с помо­щью функции fopen().fp — это указатель на файл, возвращенный fopen(), a ch - выводимый символ. Указатель на файл указывает putc(), в какой файл следует писать. По историческим причинам ch определена как int, но используется только младший бит. Если putc() выполнена успешно, она возвращает выведенный символ. В противном случае воз­вращает EOF.
int getc(FILE *fp); используется для чтения символов из потока, открытого на чтение с помощью fopen().fp - это указатель на файл типа FILE *, возвращенный fopen(). По традиции getc() возвращает целое, но старший байт установлен в 0.
int fprintf(FILE *fp, const char *форматная_строка, ...); ведет себя так же, как и printf()за тем исключением, что работает с дисковыми файлами
int fscanf(FILE *fp, const char * форматная_строка, ...); ведет себя так же, как и scanf(), за тем исключением, что работает с дисковыми файлами
size_t fread(void *буфер, size_t число_байту size_t объем, FILE *fp); функция, позволяющие читать блоки данных. буфер - это указатель на область памяти, которая получает данные из файла. возвращает число прочитанных элементов.
size_t fwrite(const void *буфер, size_t число_байт, size_t объем, FILE *fp); функция, позволяющие писать блоки данных. буфер - это указатель на информацию, записываемую в файл. Длина каждого элемента в байтах определяется в число_байт
int fseek(FILE *fp long нисло_байт, int начало); Можно выполнять операции произвольного чтения и записи, используя систему буферизированного ввода/вывода, с помощью fseek(), устанавливающей текущую файловую позицию где fp - это указатель на файл, возвращенный fopen(), число_байт - это длинное целое, содер­жащее число байт от начала до позиции маркера, а начало - это одно из следующих макроопре­делений (определенных в stdio.h):
Макроопределение Смысл
SEEK_SET SEEK_CUR SEEK_END Начало файла Текущая позиция Конец файла

 

 


Пример работы fread, fwrite:

Одно из наиболее полезных применений fread() и fwrite() - это чтение и запись блоков данных типа массивов или структур. Например, следующий фрагмент записывает содержимое массива вещественных чисел balance в файл balance, используя один оператор fwrite(). Далее она читает массив, используя один оператор fread(), и выводит его содержимое.

#include <stdio.h>
int main(void)
{
register int i;
FILE *fp;
float balance[100];

/* открытие на запись */
if((fp=fopen("balance", "wb"))==NULL) {
printf("Cannot open file.");
return 1;
}
for(i=0; i<100; i++) balance[i] = (float) i;

/* сохранение за раз всего массива balance */
fwrite(balance, sizeof balance, 1, fp) ;
fclose(fp);
/* обнуление массива */
for(i=0; i<100; i++) balance[i] = 0.0;
/* открытие для чтения */
if((fp=fopen("balance","rb"))==NULL) {
printf("cannot open file");
return 1;
}

/* чтение за раз всего массива balance */
fread(balance, sizeof balance, 1, fp);

/* вывод содержимого массива */
for(i=0; i<100; i++) printf("%f ", balance [i]);
fclose(fp);
return 0;
}

 


Задачи

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

2. Написать программу, которая считывает текст и заменяет все точки сокращением «тчк», а запятые – сокращением «зпт»

3. Написать программу, которая считывает текст и удаляет все лишние пробелы, оставив между словами только один пробел, а между предложениями – 2 пробела

4. Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова «ноль», «один», …, начиная каждое предложение с новой строки