Файлы произвольного доступа




Краткие теоретические положения

Файловые операции ввода-вывода можно выполнять после включения в программу заголовка <fstream>, в котором определены все необходимые для этого классы и значения.

Открытие и закрытие файла

В С++ файл открывается путем связывания его с потоком. Существуют потоки трех видов: ввода, вывода и ввода-вывода. Чтобы открыть входной поток, необходимо объявить потоковый объект ifstream. Для открытия выходного потока нужно объявить поток типа ofstream. Поток, который предполагается использовать для операций ввода и вывода должен быть объявлен как объект класса fstream. Например:

ifstream in;

ofstream out;

fstream f;

Создав поток, нужно его связать с файлом. Это можно сделать с помощью функции open(). Ее используют следующим образом:

имя_потока. open (имя_файла, режим);

имя_файла может включать путь к файлу.

режим должен принимать одно или несколько значений перечисления openmode:

ios:app

ios:ate

ios:binary

ios:in

ios:out

ios:trunc

Назначение каждого из значений:

· app - присоединение к концу файла всех выводимых данных (только для файлов, открытых для вывода данных);

· ate – поиск будет начинаться с конца файла;

· binary - открытие файла в двоичном режиме; по умолчанию все файлы открываются в текстовом режиме. По умолчанию все файлы открываются в текстовом режиме. В текстовом режиме могут происходить некоторые преобразования символов (например, последовательность, состоящая из символов возврата каретки и перехода на новую строку, может быть преобразована в символ новой строки). При открытии файла в двоичном режиме никакого преобразования символов не происходит. Любой файл можно открыть как в текстовом, так и в двоичном режиме. Единственное различие между этими режимами состоит в преобразовании (или нет) символов.

· in - открытие файла для ввода данных (обычно это значение по умолчанию);

· out – открытие файла для вывода данных (обычно это значение по умолчанию);

· trunc – при открытии уже существующего файла его содержимое удаляется.

Пример создания и открытия обычного выходного файла:

ofstream out;

out.open(“test1.txt”);

Так как параметр mode функции open() по умолчанию устанавливается равным значению, соответствующему типу открываемого потока, в предыдущем примере нет необходимости задавать его значение.

Можно проверить успешность выполнения предыдущей операции по созданию и открытию файла следующим образом:

if(!out)

{cout<< “НЕ удается открыть файл.\n”;

//return 1;

}

Прежде чем выполнять какие-либо дальнейшие операции с файлом, всегда следует проверять результат выполнения функции open().

Можно также проверить файкт успешного открытия файла с помощью функции is_open():

if(!out.is_open())

{cout<< “файл не открыт!\n”;

//return 1;

}

Производить операцию открытия файла можно также так:

ofstream out1("test1.txt");

ofstream out2("test2.txt",ios::out);

Параметры у конструкторов классов ifstream, ofstream, fstream совпадают с соответствующими параметрами функции open().

Чтобы закрыть файл после использования необходимо вызвать функцию close(), например:

out1.close();

Пример создания и открытия файла:

#include <fstream>

using namespace std;

 

int main()

{ofstream out1("test1.txt");

//или так:

//ofstream out1("test1.txt",ios::out);

out1.close();

return 0;

}

Чтение и запись текстовых файлов

Проще всего считывать данные из текстового файла или записывать их в него с помощью операторов << и >>. Например, в следующей программе выполняется запись в файл целого числа и строки:

#include <fstream>

using namespace std;

 

int main()

{ofstream out1("test1.txt");

if(!out1)

{cout<< "НЕ удается открыть файл.\n";

return 1;

}

out1 << "Это пример ФАЙЛА. \n";

out1 << 10;

out1.close();

return 0;

}

Следующая программа считывает строку и целое число из файла, созданного при выполнении предыдущей программы:

#include <fstream>

#include <iostream>

#include <conio.h>

using namespace std;

 

int main()

{int x; char str[80];

ifstream in("test1.txt");

if(!in)

{cout<< "НЕ удается открыть файл.\n";

return 1;

}

in >> str; in >> x;

cout << str << " " << x << "\n";

in.close();

getch(); return 0;

}

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

Файлы произвольного доступа

Последовательный доступ – наиболее распространенный метод доступа к файлам. Однако, возможен и другой тип доступа.

До сих пор рассматривались только файлы последовательного доступа. Данные, которые записываются в файл последовательного доступа, не могут модифицироваться без риска разрушения остальных данных в файле. Файлы последовательного доступа не подходят для приложений с так называемым «немедленным доступом», в которых конкретная запись информации должна быть локализована немедленно. Примерами таки приложений с немедленным доступом являются, например, системы бронирования билетов, банковские системы, системы терминалов для электронных платежей и др.

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

Для работы с файлами произвольного доступа используются функции:

write – для записи данных в файл

read – для чтения данных из файла

seekp – для установки позиции чтения-записи.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: