- •Функции стандартного ввода/вывода
- •Примечание
- •Примечание
- •9.2.2 Ввод/вывод с использованием разных классов
- •Пространства имен
- •Работа с классом fstream
- •Is_open() — если файл открыт, то функция возвращает true, иначе - false;
- •Работа с классом ofstream
- •Работа с классом ifstream
- •Работа с бинарным файлом
- •Общие положения
- •Стандартный ввод cin
Работа с классом fstream
Члены этого класса позволяют открыть файл, записать в него данные, переместить указатель позиционирования (указатель, показывающий, в каком месте файла мы находимся), прочитать данные. Этот класс имеет такие основные функции (методы):
open() — открывает файл;
close() —закрывает файл;
Is_open() — если файл открыт, то функция возвращает true, иначе - false;
rdbuf() — выдает указатель на буфер ввода/вывода.
Параметры функции open():
имя открываемого файла;
способ открытия файла.
Способ открытия файла задается значением перечислимой переменной:
enum open_mode {app, binary, in, out, trunc, ate};
Эта переменная определена в базовом классе ios, поэтому обращение к перечислимым значениям в классе fstream, с экземпляром которого мы работаем, должно идти с указанием класса-родителя: ios:: арр, ios:: binary и т. д.
Назначение способов открытия файла:
арр — открыть файл для дозаписи в его конец;
binary — открыть файл в бинарном виде (такие файлы были записаны по определенной структуре данных и поэтому должны читаться по этой же структуре);
in — открыть файл для чтения из него;
out — открыть файл для записи в него. Если файл не существует, он будет создан;
trunc — уничтожить содержимое файла, если файл существует (очистить файл);
ate — установить указатель позиционирования файла на его конец.
При задании режимов открытия файла можно применять оператор логического или (|), чтобы составлять необходимое сочетание режимов открытия.
В листинге 9.10 приведен пример программы работы с классом fstream, результат работы показан на рис. 9.8.
Листинг 9.10
// З8.срр : Defines the entry point for the console application.
#include "stdafx.h"
#include < fstream>
#include <iostream>
#include <conio.h>
#include <stdio.h>
void _tmain()
{
using namespace std;
/*Используется стандартное пространство имен. Создание двунаправленного (чтение/запись в одном и том же файле) объекта (экземпляра)*/
fstream inout;
inout.open("fstream.out", ios_base::in | ios_base::out | ios_base::trunc);
//вывод в файл
inout << "This is the story1 of a man" << endl;
inout << "This is the story2 of a man" << endl;
inout << "This is the story3 of a man" << endl;
char p[100];
//установка указателя файла (позиционирование) в его начало
inout.seekg(0);
//чтение 1-й строки (длиной не более 100 символов)
inout.getline(p,100);
//вывод 1-й строки на экран (stdout)
cout << endl << "Stringl :" << endl;
cout << p;
//запоминание текущей позиции в файле после 1-го вывода
fstream::pos_type pos = inout.tellg();
//чтение 2-й строки из файла
inout.getline(p,100);
//вывод 2-й строки на экран (stdout)
cout << endl << "String2 :" << endl;
cout << p;
//чтение 3-й строки из файла
inout.getline(p,100);
//вывод 3-й строки на экран (stdout)
cout << endl << "String3 :" << endl;
cout << p;
//установка указателя перед 2-й строкой inout.seekp(pos);
//запись на место 2-й строки
inout << "This is the story2 of a man" << endl;
//запись на место 3-й строки
inout << "This is the story3 of a man" << endl;
//установка на начало файла
inout. seekg (0);
//вывод всего содержимого потока на экран (stdout)
cout << endl << endl < inout. rdbuf();
inout.close();
system ("DEL FSTREAM.OUT") ;
_getch();
}
Алгоритм примера состоит в следующем: в файл записываются три строки текста. Затем они последовательно читаются, и к каждой из них добавляется строка с ее названием.
Рис. 9.8. Результаты работы программы листинга 9.10