Для вывода данных используеся оператор <<. Этот опрератор определен для всех встроенных типов 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
0showbase - включает вывод 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 abcskipws - пропуск символов-разделителей (' ', '\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
-#######10scientific - научная запись для чисел с плавающей запятой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.5678endl - запись \n и очистка буфераends - запись \0flush - очистка буфера потока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