Потоки в C++ / Alexey Nurgaliev

Потоки вывода (ostream)

Для вывода данных используеся оператор <<. Этот опрератор определен для всех встроенных типов C++ и некоторых классов, входящих в стандартную библиотеку. Для вывода перевода строки можно использовать специальный объект endl.

Примеры использования потока вывода:

int i = 10;
char c = 'A';
char cs[] = "C string";
bool b = true;
double d = 3.14159265;
string s = "STL string";

cout << i <<endl;
cout << c << 'B' << endl;
cout << cs << endl << b << endl;
cout << d << endl;
cout << s << endl;

Будет выведено:

10
AB
C string
1
3.14159
STL string

Также оператор << можно использовать и со своими классами, определив для них перегруженный оператор. Например, для структуры Book перегруженный оператор может выглядеть так:

struct Book{
	string title, author;
	int num_pages;
};

std::ostream& operator<<(std::ostream &s, const Book &b){
	return (s << b.author << " " << b.title << " (" << b.num_pages << ")");
}

//используется оператор таким образом:
Book b;
b.title = "the book";
b.author = "the author";
b.num_pages = 128;
std::cout << b << std::endl;

Некоторые методы класса ostream:

Потоки ввода (istream)

Для ввода используется оператор >>. Он также определен для всех встроенных типов и некоторых классов стандартной библиотеки.

Оператор >> также можно определить для своих классов:

istream& operator>>(istream& s)
{
	...
}

Некоторые методы класса istream:

Форматирование

Для управления форматом вывода можно устанавливать специальные флаги потока методом setf(ios_base::fmtflags f). Но удобнее пользоваться манипуляторами - специальными функциями, реализованными в заголочных файлах <istream>, <ostream> (они по умолчанию включены в <iostream>) и <iomanip>.

Основные манипуляторы ввода/вывода:

cout << boolalpha << true << endl;
cout << noboolalpha << false;

Выведет:

true
0
cout << showbase << uppercase;
cout << oct << 0777 << ' ';
cout << hex << 0xABC << endl;
cout << noshowbase << nouppercase;
cout << oct << 0777 << ' ';
cout << hex << 0xABC << endl;

Выведет:

0777 0XABC
777 abc
cout << setw(10);
cout << setfill('#');
cout << 1 << endl;
cout << setw(5);
cout << 100 << endl;
cout << left << setw(10) << -100 << endl;
cout << right << setw(10) << -100 << endl;
cout << internal << setw(10) << -100 << endl;

Выведет:

#########1
##100
-100######
######-100
-#######10
cout << 1234.5678 << endl;
cout << scientific << 1234.5678 << endl;
cout << fixed << 1234.5678 << endl;

cout << setprecision(4);
cout << 1234.5678 << endl;
cout << scientific << 1234.5678 << endl;
cout << fixed << 1234.5678 << endl;

Выведет:

1234.57
1.234568e+003
1234.567800
1234.5678
1.2346e+003
1234.5678

Сотояние потока

Каждый поток istream или ostream имеет связанное с ним состояние.

Методы проверки состояния:

Стандартные потоки - iostream

Для реализации стандартного ввода/вывода в библиотеку C++ включен заголовочный файл iostream, содержащий следующие предопределенные объекты потоков:

Файловые потоки - fstream

Файловые потоки расположены в заголовочном файле <fstream>. ifstream - поток ввода, ofstream - поток вывода.

Имя файла передается потоку либо в конструкторе, либо через вызов метода open.

ofstream out_1("test1.txt");
ofstream out_2;
out_2.open("test2.txt");

...

out_1.close();
out_2.close();

Строковые потоки - sstream

Строковые потоки расположены в заголовочном файле <sstream>.

istringstream - поток ввода. Строка передается потоку в конструкторе.

ostringstream - поток вывода. Строку-результат возвращает метод str().

string str = "1 2 3";
istringstream iss(str);
ostringstream oss;
int a, b, c;
iss >> a >> b >> c;
oss << a << endl;
oss << setw(5) << setfill('#');
oss << b << endl;
oss << c;
cout << oss.str();

Выведет:

1
####2
3
Лицензия Creative Commons
Code More Team - GitHub