Для вывода данных используеся оператор <<
. Этот опрератор определен для всех встроенных типов 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:
put(char c)
- записать символ с в потокwrite(const char* s, streamsize n)
- записать первые n элементов массива s в поток (streamsize представляет целое число со знаком, например, int)flush()
- записать значение из буфераclose()
- закрытие потокаДля ввода используется оператор >>
. Он также определен для всех встроенных типов и некоторых классов стандартной библиотеки.
Оператор >>
также можно определить для своих классов:
istream& operator>>(istream& s)
{
...
}
Некоторые методы класса istream:
get()
- считать следующий символget(char *buf, streamsize n)
- считать максимум n-1 символ и поместить в массив bufget(char *buf, streamsize n, char delim)
- считывание символов до символа-разделителя delim (разделитель не считывается и остается в потоке)getline(char *buf, streamsize n)
getline(char *buf, streamsize n, char delim)
peek()
- считывает следующий символ, но оставляет его в потокеignore(streamsize n = 1, int delim = EOF)
- извлекает символы из потока до тех пор, пока их число меньше n или пока не встретился символ delimputback(char c)
- добавляет символ с в текущую позицию потокаunget()
- возвращает последний считанный символ в потокДля управления форматом вывода можно устанавливать специальные флаги потока методом setf(ios_base::fmtflags f)
. Но удобнее пользоваться манипуляторами - специальными функциями, реализованными в заголочных файлах <istream>
, <ostream>
(они по умолчанию включены в <iostream>
) и <iomanip>
.
Основные манипуляторы ввода/вывода:
boolalpha
- стороковое представление логических значенийnoboolalpha
- числовое представление логических значенийcout << boolalpha << true << endl;
cout << noboolalpha << false;
Выведет:
true
0
showbase
- включает вывод 0 перед восьмеричными и 0x перед шестнадцатеричными числамиnoshowbase
- выключает вывод 0 и 0xdec
- вывод чисел в десятичной системе счисленияoct
- в восьмеричнойhex
- в шестнадцатеричнойuppercase
- заглавные буквы в записи шестнадцатеричных чисел и чисел с плавающей запятой в научной записиnouppercase
- строчные буквы в записи чиселcout << showbase << uppercase;
cout << oct << 0777 << ' ';
cout << hex << 0xABC << endl;
cout << noshowbase << nouppercase;
cout << oct << 0777 << ' ';
cout << hex << 0xABC << endl;
Выведет:
0777 0XABC
777 abc
skipws
- пропуск символов-разделителей (' ', '\t', '\n', и т.п.
)noskipws
- выключение пропуска разделителейsetw(int n)
- определяет минимальное количество символов, которые выведутся следующей операцией выводаsetfill(char c)
- символ-заполнительleft
- выравнивание поля по левому краюright
- выравнивание поля по правому краюinternal
- выравнивание поля по ширине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
scientific
- научная запись для чисел с плавающей запятойfixed
- фиксированная точность для чисел с плавающей запятойsetprecision
- точность вывода чисел (по умолчанию равна 6)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
endl
- запись \n
и очистка буфераends
- запись \0
flush
- очистка буфера потокаws
- прочитать и проигнорировать символы-разделителиКаждый поток istream
или ostream
имеет связанное с ним состояние.
Методы проверки состояния:
good()
- можно выполнить следующую операциюeof()
- конец потокаfail()
- следующая операция не выполнитсяbad()
- поток испорченДля реализации стандартного ввода/вывода в библиотеку C++ включен заголовочный файл iostream
, содержащий следующие предопределенные объекты потоков:
Файловые потоки расположены в заголовочном файле <fstream>
. ifstream
- поток ввода, ofstream
- поток вывода.
Имя файла передается потоку либо в конструкторе, либо через вызов метода open
.
ofstream out_1("test1.txt");
ofstream out_2;
out_2.open("test2.txt");
...
out_1.close();
out_2.close();
Строковые потоки расположены в заголовочном файле <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