Потоковый ввод/вывод(Stream I/O)

Для использования объектно-ориентированного консольного ввода-вывода с помощью потоков (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; }
Comments