- •Тема 14. Файлы Понятие файла. Процедуры для работы с файлами – открытие и закрытие файлов. Создание и работа с текстовыми файлами. Основные функции чтения-записи
- •14.1.Понятие файла
- •14.2. Функции для работы с файлами
- •File *указатель на файл;
- •File *fl1, *fl2;
- •14.2.1. Функции для открытия-закрытия файла
- •File *fopen(const char *имя_файла, const char *режим_открытия);
- •File *fl;
- •File *fl;
- •Return 1;
- •File *fl;
- •Int fclose(file *указатель_на _файл);
- •File *fl;
- •Int *fscanf(file * указатель_на _файл,
File *fl;
fl = fopen("lab2.dat","w”);
Более грамотно бедут:
File *fl;
if ((fl = fopen("lab2.dat","w"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
Return 1;
}
Такой алгоритм позволяет обнаружить любую ошибку, возникающею при создании файла.
Для исключения ошибки, возникающей при открытии несуществующего файла, можно использовать конструкцию:
File *fl;
if ((fl = fopen("lab2.dat","r"))==NULL)
{
fl = fopen("lab2.dat","w");
}
При попытке открыть несуществующий файл в режиме дозаписи, он будет автоматически создан.
Разница между режимами r+ и w+ состоит в том, что если файл не существует, то в режиме открытия r+ он создан не будет, а в режиме w+ будет создан! Если файл уже существует, то открытие его в режиме w+ приведет к утрате его содержимого, а в режиме r+ оно останется нетронутым.
При записи обмен происходит не непосредственно с файлом, а с некоторым буфером. Информация из буфера переписывается в файл только при переполнении буфера или при закрытии файла.
Для закрытия файла используется функция fclose(). Прототип функции:
Int fclose(file *указатель_на _файл);
Функция закрывает поток, который был открыт с помощью вызова fopen() и записывает в файл все данные, которые еще оставались в дисковом буфере. Доступ к файлу после выполнения функции будет запрещен.
Возвращение нуля означает успешную операцию закрытия. В случае же ошибки возвращается EOF. Чтобы точно узнать, в чем причина этой ошибки, можно использовать стандартную функцию ferror().
Для закрытия нескольких файлов введена функция:
int fcloseall(void);
Функция закрывает все открытые файлы. Возвращает количество закрытых файлов или EOF, если возникает ошибка. В MVC++ 2005 функция пишется:_fcloseall.
14.2.1. Функции для модификации содержимого файла
Функция
int putc(int символ, FILE * указатель_на _файл);
записывает один символ в текущую позицию указанного открытого файла. Хотя символ и определяется как int, однако записывается только младший байт (соответствующийchar). Если функция выполнилась успешно, то возвращается записанный символ, иначе – EOF.
Функция
int getc(FILE * указатель_на _файл);
читает один символ из текущей позиции указанного открытого файла. После чтения указатель сдвигается на одну позицию вперед. Если достигнут конец файла, то функция возвращает значение EOF.
Пример: Открыть файл и записывать туда вводимые с клавиатуры символы, до тех пор, пока не будет введен символ ‘!’. Прочитать полученный файл.
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
FILE *fl;
void flr();
void flw();
int main()
{
flr(); // Запись в файл
flw(); // Чтение из файла
return 0;
}
void flr()
{
if ((fl = fopen("lab2.dat","w"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
char ch;
do {
cin >> ch;
putc(ch, fl);
} while (ch != '!');
fclose(fl);
}
void flw()
{
if ((fl = fopen("lab2.dat","r"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
char ch= getc(fl);
while (ch != EOF)
{
cout << ch << " ";
ch=getc(fl);
}
fclose(fl);
}
Функция
int feof(FILE *указатель_на_файл);
возвращает отличное от нуля значение (true) если достигнут конец файла, и ноль (false), если конец файла не достигнут. Функция может работать с любыми типами файлов.
Функция flwв предыдущем примере может выглядеть так:
void flw()
{
if ((fl = fopen("lab2.dat","r"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
while(!feof(fl)) cout << getc(fl) << " ";
fclose(fl);
}
Функция
int fputs(const char * строка, FILE * указатель_на _файл);
записывает строку символов в текущую позицию указанного открытого файла. В случае ошибки эта функция возвращает EOF. Нулевой символ в файл не записывается.
Функция
char *fgets(char *строка, intдлина,
FILE * указатель_на _файл);
читает строку символов из текущей позиции указанного открытого файла до тех пор, пока не будет прочитан символ перехода на новую строку, или количество прочитанных символов не станет равным длина-1. Если был прочитан разделитель строк, он записывается в строку. Полученная в результате строка будет оканчиваться символом конца строки ('\0'). В случае ошибки функция возвращаетNULL
Пример: Открыть файл и записывать туда все введенные с клавиатуры строки, до тех пор, пока не будет введена пустая строка. Прочитать полученный файл.
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>