До сих пор мы рассматривали программы, в которых использовали только ifstream – класс входных файловых потоков (для чтения файла) и ofstream – класс выходных файловых потоков (для записи в файл). Хотя, как уже раннее говорилось, существует ещё fstream – класс двунаправленных файловых потоков. Двунаправленный файловый поток обеспечивает возможность считывать данные из файла и записывать данные в файл, ограничиваясь всего одним потоком и объектом. Использование класса двунаправленных файловых потоков освобождает нас от необходимости создания файловых объектов, предназначенных либо для ввода, либо для вывода. Таким образом, с помощью объекта класса fstream можно создать поток к файлу, который может быть использован как входной и выходной.
Создавать двунаправленные файловые потоки имеет смысл в том случае, когда в одной программе необходимо обеспечивать как считывание данных из файла, так и запись данных. Причём ввод/вывод может происходить хаотично или вследствие определённых событий или действий пользователя. Приведём пример, демонстрирующий создание двунаправленного файлового потока.
…
fstream file;
file.open("имя_файла", ios::out | ios::in | ios::binary);
…
file.write(…);
…
file.read(…);
…
Здесь, с помощью объекта file можно осуществлять как считывание данных из файла, так и запись данных в этот файл.