- •Тема 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;
void fsr();
void fsw();
int main()
{
fsr(); // Запись в файл
fsw(); // Чтение из файла
return 0;
}
void fsr()
{
if ((fl = fopen("lab2.dat","w"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
cout << "Vvedite sytoki" << endl;
char str[80];
do {
gets(str);
strcat(str, "\n"); // добавление разделителя строк
fputs(str, fl);
} while(*str!='\n');
fclose(fl);
}
void fsw()
{
if ((fl = fopen("lab2.dat","r"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
char str[80];
while(!feof(fl))
{
if( fgets( str, 100, fl ) != NULL) cout << str;
}
fclose(fl);
}
Кроме основных функций ввода/вывода, также часто используются функции fprintf() и fscanf().
Функция
int *fprintf(FILE * указатель_на _файл,
const char * управляющая_строка);
записывает форматированные данные в файл. Управляющая_строкаопределяет строку форматирования аргументов, заданных своими адресами. Обычно эта строка состоит из последовательности символов “%”, после которых следует символ типа данных:
I или i |
Десятичное, восьмеричное или шестнадцатеричное целое |
D или d |
Десятичное целое |
U или u |
Десятичное целое без знака |
E или e |
Действительное с плавающей точкой |
s |
Строка символов |
c |
Символ |
Функция
Int *fscanf(file * указатель_на _файл,
const char * управляющая_строка);
читает форматированные данные из файла. Строка форматирования строится аналогично функции fprintf.
Следует обратить внимание на то, что при чтении данных всегда указываются адреса переменных (&), а не сами переменные.
ПримерЗапись и чтение данных из файла.
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fl;
double v; char st[81]; int n; char ch;
void fpr();
void fpw();
int main()
{
fpr(); // Запись в файл
fpw(); // Чтение из файла
return 0;
}
void fpr()
{
if ((fl = fopen("lab2.dat","w"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
v=3.14;
n=298;
fprintf( fl,"%s %e %d %c", "string",v,n,'x');
fclose(fl);
}
void fpw()
{
if ((fl = fopen("lab2.dat","r"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
fscanf(fl,"%s %e %d %c",st,&v,&n,&ch);
cout << st << endl;
cout << v << endl;
cout << n << endl;
cout << ch << endl;
fclose(fl);
}
Функция
void rewind(FILE * указатель_на _файл);
устанавливает указатель текущей позиции выделенного файла в начало файла.
Функция
int ferror(FILE * указатель_на _файл);
определяет, произошла ли ошибка во время работы с файлом. Она возвращает ненулевое значение (true), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает 0 (false).
Функция
size_t fwrite(const void *записываемое_данное,
size_t размер_элемента, size_tчисло_элементов,
FILE *указатель_на _файл);
записывает в файл заданное число данных заданного размера. Размер данных задается в байтах. Тип size_t определяется как целое без знака. Функция возвращает число записанных элементов. Если число записанных элементов не равно заданному, то возникла ошибка.
Функция
size_t fread(void * считываемое_данное,
size_t размер_элемента, size_tчисло_элементов,
FILE *указатель_на _файл);
считывает в указанное данное заданное число данных заданного размера. Размер данных задается в байтах. Функция возвращает число прочитанных элементов. Если число записанных элементов не равно заданному, то возникла ошибка.
Функции fread() и fwrite() при открытии файла для работы с двоичными данными могут работать с информацией любого типа.
Функция
int fileno(FILE * указатель_на _файл);
возвращает значение дескриптора указанного файла (дескриптор – логический номер файла для заданного потока).
Функция
long filelength(int дескриптор);
возвращает длину файла с соответствующим дескриптором в байтах.
Функция
int chsize(intдескриптор, longразмер);
устанавливает новый размер файла с соответствующим дескриптором. Если размер файла увеличивается, то в конец добавляются нулевые символы, если размер файла уменьшается, то все лишние данные удаляются.
Функция
long ftell(FILE * указатель_на _файл);
возвращает значение указателя на текущую позицию файла.
Функция
int fgetpos(FILE *stream, fpos_t *позиция);
определяет значение текущей позиции файла.
Функция
int fseek(FILE * указатель_на _файл, long int число_байт, int точка_отсчета);
устанавливает указатель в заданную позицию. Заданное количество байт отсчитывается от начала отсчета , которое задается следующими макросами: начало файла – SEEK_SET, текущая позиция – SEEK_CUR, конец файла – SEEK_END. При успешном завершении работы функция возвращает нуль, а в случае ошибки — ненулевое значение.
Пример: Открыть файл и записывать туда все вводимые с клавиатуры числа, до тех пор, пока не будет введено число -1. Отсортировать данные в файле по возрастанию.
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
FILE *fl;
void fbr();
void fbsort();
void fbw();
int main()
{
fbr(); // Запись в файл
fbsort(); // Сортировка в файле
fbw(); // Чтение из файла
return 0;
}
void fbr()
{
if ((fl = fopen("lab2.dat","wb"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
int a;
do {
cin >> a;
int nwrt = fwrite( &a, sizeof(int), 1, fl );
} while (a != -1);
fclose(fl);
}
void fbsort()
{
if ((fl = fopen("lab2.dat","rb+"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
int nb =sizeof(int), a, b, nwrt;
int n=filelength(fileno(fl))/nb;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
{
fseek(fl ,i*nb , SEEK_SET); nwrt = fread( &a, nb, 1, fl );
fseek(fl ,j*nb , SEEK_SET); nwrt = fread( &b, nb, 1, fl );
if (a>b)
{
fseek(fl ,i*nb , SEEK_SET); nwrt = fwrite( &b, nb, 1, fl );
fseek(fl ,j*nb , SEEK_SET); nwrt = fwrite( &a, nb, 1, fl );
}
}
fclose(fl);
}
void fbw()
{
if ((fl = fopen("lab2.dat","rb"))==NULL)
{
cout << "Oshibka pri otritii"<<endl;
exit(1);
}
int a;
while(true)
{
int nwrt = fread( &a, sizeof(int), 1, fl );
if (nwrt!=1) break;
cout << a << " ";
}
fclose(fl);
}