Для использования объектно-ориентированного консольного
ввода-вывода
с помощью потоков (stream) STL в программу необходимо включить
заголовочный файл
<iostream>
, а для файлового ещё и
<fstream>
.
При запуске консольного приложения неявно открываются четыре потока:
сin — для ввода с клавиатуры,
сout — для буферизованного вывода на монитор,
сerr — для небуферизованного вывода на монитор сообщений об ошибках и
clog — буферизованный аналог
cerr. Эти четыре символа определены посредством
<iostream>
.
Для ввода-вывода сначала необходимо создать поток — экземпляр
соответствующего класса STL, а затем связать его с файлом. Для потока
вывода используется класс
ofstream, для потока ввода —
ifstream, для потока ввода-вывода —
fstream. В каждом из этих классов есть метод
open(),
который связывает поток с файлом. Проще говоря, открывает файл. Методу
передаются два параметра: имя файла и режим открытия файла. Второй
параметр представляет собой набор битовых флагов, определяющих режим
открытия файла (чтение, запись и пр.) и способ работы с данными
(текстовый или двоичный режим). Второй параметр опционален, т.е. имеет
значение по умолчанию, соответствующее классу.
Потоки
cin,
cout и
cerr соответствуют потокам
stdin,
stdout и
stderr соответственно.
Операции чтения и записи в поток, связанный с файлом, осуществляются
либо с помощью операторов
<< и
>>, перегруженных для классов
потоков ввода-вывода, либо с помощью любых других методов классов
потоков ввода-вывода.
Некоторые наиболее употребляемые методы:getline() // читает строку из входного потока.
get() // читает символ из входного потока.
ignore() // пропускает указанное число элементов от текущей позиции чтения.
read() // читает указанное количество символов из входного потока и сохраняет их в буфере (неформатированный ввод)
flush() // вывод содержимого буфера в файл (при буферизованном вводе-выводе)
put() // выводит символ в поток.
write() // выводит в поток указанное количество символов из буфера (неформатированный вывод)
|
Пример использования потоков STL:
#include <iostream>
#include <fstream>
using namespace std;
const char *filename = "testfile2.txt";
int main()
{
// создание потока, открытие файла для записи в текстовом режиме,
// запись данных и закрытие файла.
ofstream ostr;
ostr.open(filename);
if (ostr) {
for (int i = 0; i < 16; i++) {
ostr << i*i << endl;
if (ostr.bad()) {
cerr << "Unrecoverable write error" << endl;
return 1;
}
}
ostr.close();
}
else {
cerr << "Output file open error \"" << filename << "\"" << endl;
return 1;
}
// открытие файла (в конструкторе) для чтения в текстовом режиме,
// чтение данных, форматированный вывод на консоль, закрытие файла.
int data;
int counter = 0;
ifstream istr(filename);
if (istr) {
while (!(istr >> data).eof()) {
if (istr.bad()) {
cerr << "Unrecoverable read error" << endl;
return 2;
}
cout.width(8);
cout << data;
if (++counter % 4 == 0) {
cout << endl;
}
}
istr.close();
}
else {
cerr << "Input file open error \"" << filename << "\"" << endl;
return 2;
}
return 0;
}