1) Объявление файла
FILE *идентификатор;
Пример
FILE *f;
2) Открытие файла:
Функция открытия файла называется fopen(). Она возвращает указатель на объект стандартного (определенного в данной библиотеке) типа FILE. Параметров у функции fopen() два. Первый – это путь к файлу (строка), второй – параметры открытия файла.
fopen(имя физического файла, режим доступа)
Режим доступа — строка, указывающая режим открытия файла и тип файла
Типы файла: бинарный (b); текстовый (t)
Допустим, мы хотим создать в текущем каталоге проекта новый текстовый файл и записать в него два числа и строку. Пусть этот файл будет называться test.txt. Параметр открытия файла на запись в текстовом виде записывается строкой "wt". Буква w означает write (писать), буква t – text (текст). Если такой файл в каталоге существует, он перезаписывается (все старое содержимое в нем уничтожается), если он не существует, то создается исходно пустым.
Тогда команда открытия (создания пустого) файла запишется так:
FILE * fo;
fo = fopen("test.txt","wt");
Можно задать и полный путь к файлу, например:
fo = fopen("c:\\tmp\\test.txt","wt");
Не забываем, что одиночный символ \ внутри строки С++ задается двумя наклонными слэшами \\. Это частая ошибка.
После открытия файла в файловую переменную fo занесется некоторое число. Если таким числом будет ноль, считается, что файл открыть не удалось. В С++ нередки записи вида
if( (fo=fopen("c:\\tmp\\test.txt","wt")) == 0 ) {
// ошибка!
}
где одновременно открывается файл и проверяется, успешно ли это сделано.
В таблице 1 приведены различные режимы открытия файла.
Таблица 1.
Режимы открытия файла
Значение |
Описание |
r |
Файл открывается только для чтения |
w |
Файл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан |
a |
Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
r+ |
Файл открывается для чтения и записи. |
w+ |
Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан |
a+ |
Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
Например:
f = fopen(s, "wb");
k = fopen("h:\ex.dat", "rb");
1.3 Неформатированный файловый ввод-вывод
1) Запись в файл
fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);
Например,
fwrite(&dat, sizeof(int), 1, f);
2) Чтение из файла
fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);
Например,
fread(&dat, sizeof(int), 1, f);
3) Закрытие файла
fclose(имя логического файла);
Пример 1. Заполнить файл некоторым количеством целых случайных чисел.
#include <cstdlib>
#include <iostream>
#include <conio.h>
int main() {
FILE *f;
int dat;
int n=rand()%30 + 1;
cout << "File name? ";
char s[20];
cin.getline(s, 20);
f=fopen(s, "wb");
for (int i=1; i<=n; i++) {
dat = rand()%101 - 50;
cout << dat << " ";
fwrite(&dat, sizeof(int), 1, f);
}
cout << “\n”;
fclose(f);
getch();
}
Пример 2. Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/w), возраст (в мес.), масса.
#include <cstdlib>
#include <iostream>
#include <conio.h>
struct krolik {
char pol;
int vozrast;
double massa;};
int main() {
FILE *f;
krolik dat;
int n;
cout << "File name? ";
char s[20];
cin.getline(s, 20);
f=fopen(s, "wb");
cout << "How many rabbits? "; cin >> n;
for (int i=1; i<=n; i++) {
cout << "What sex " << i << "th rabbit? "; cin >> dat.pol;
cout << "How old " << i << "th rabbit? "; cin >> dat.vozrast;
cout << "What is the mass of the " << i << "th rabbit? "; cin >> dat.massa;
fwrite(&dat, sizeof(krolik), 1, f);
}
fclose(f);
getch();
}
Пример 3 (продолжение). В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/w), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше.
#include <cstdlib>
#include <iostream>
#include <conio.h>
struct krolik {
char pol;
int vozrast;
double massa;};
int main() {
FILE *f;
krolik dat, max;
int n;
cout << "File name? ";
char s[20];
cin.getline(s, 20);
f=fopen(s, "rb");
fread(&dat, sizeof(krolik), 1, f);
max=dat;
while (fread(&dat, sizeof(krolik), 1, f))
{if (dat.vozrast>max.vozrast) max=dat;
else if (dat.vozrast==max.vozrast&&dat.massa>max.massa) max=dat;}
cout << "The oldest rabbit has a sex " << max.pol << ", age " << max.vozrast << " and mass " << max.massa << endl;
getch();
}