
- •Работа с файлами
- •Открытие файла: функция fopen
- •Константа null
- •Диагностика ошибок: функция perror
- •Функции бинарного чтения и записи fread и fwrite
- •Закрытие файла: функция fclose
- •Пример: подсчет числа символов и строк в текстовом файле
- •Форматный ввод-вывод: функции fscanf и fprintf
- •Понятие потока ввода или вывода
- •Функции scanf и printf ввода и вывода в стандартные потоки
- •Функции текстового преобразования sscanf и sprintf
- •Другие полезные функции ввода-вывода
Закрытие файла: функция fclose
По окончании работы с файлом его надо обязательно закрыть. Система обычно запрещает полный доступ к файлу до тех пор, пока он не закрыт. (Например, в нормальном режиме система запрещает одновременную запись в файл для двух разных программ.) Кроме того, информация реально записывается полностью в файл лишь в момент его закрытия. До этого она может содержаться в оперативной памяти (в так называемой файловой кеш-памяти), что при выполнении многочисленных операций записи и чтения значительно ускоряет работу программы.
Для закрытия файла используется функция fclose с прототипом
int fclose(FILE *f);
В случае успеха функция fclose возвращает ноль, при ошибке - отрицательное значение (точнее, константу конец файла EOF, определенную в системных заголовочных файлах как минус единица). При ошибке можно воспользоваться функцией perror, чтобы напечатать причину ошибки. Отметим, что ошибка при закрытии файла - явление очень редкое (чего не скажешь в отношении открытия файла), так что анализировать значение, возвращаемое функцией fclose, в общем-то, не обязательно. Пример использования функции fclose:
FILE *f;
f = fopen("tmp.res", "wb"); // Открываем файл "tmp.res"
if(f == 0)
{
perror("Не могу открыть файл для записи");
exit(1); // завершить работу программы с кодом 1
}
. . .
// Закрываем файл
if (fclose(f) < 0) perror("Ошибка при закрытии файла");
Пример: подсчет числа символов и строк в текстовом файле
В качестве содержательного примера использования рассмотренных выше функций файлового ввода приведем программу, которая подсчитывает число символов и строк в текстовом файле. Программа сначала вводит имя файла с клавиатуры. Для этого используется функция scanf ввода по формату из входного потока, для ввода строки применяется формат "%s.
Затем файл открывается на чтение как бинарный (это означает, что при чтении не будет происходить никакого преобразования разделителей строк). Используя в цикле функцию чтения fread, мы считываем содержимое файла порциями по 512 байтов, каждый раз увеличивая суммарное число прочитанных символов. После чтения очередной порции сканируется массив прочитанных символов и подсчитывается число символов "\n" продергивания бумаги, которые записаны в концах строк текстовых файлов. В конце закрывается файл и печатается результат.
//
// Файл "wc.cpp"
// Подсчет числа символов и строк в текстовом файле
//
#include <stdio.h> // Описания функций ввода-вывода
#include <stdlib.h> // Описание функции exit
int main()
{
char fileName[256]; // Путь к файлу
FILE *f; // Структура, описывающая файл
char buff[512]; // Массив для ввода символов
size_t num; // Число прочитанных символов
int nChars = 0; // Суммарное число символов
int nLines = 0; // Суммарное число строк
int i; // Переменная цикла
printf("Введите имя файла: ");
scanf("%s", fileName);
f=fopen(fileName, "rb"); //Открываем файл на чтение в бинарном режиме!!
if (!f)
{
perror("Не могу открыть файл для чтения");
exit(1); // закончить работу программы с кодом 1
// ошибочного завершения
}
while ( (num = fread(buff, 1, 512, f)) > 0)
{
// Читаем блок из 512 символов. num - число реально
// прочитанных символов. Цикл продолжается, пока
// num > 0
nChars += num; // Увеличиваем число символов
// Подсчитываем число символов перевода строки
for(i= 0;i<num; ++i)
{
if(buff[i] == '\n') nLines++; // Увеличиваем число строк
}
}
fclose(f);
// Печатаем результат
printf("Число символов в файле = %d\n", nChars);
printf("Число строк в файле = %d\n", nLines);
return 0; // Возвращаем код успешного завершения
}