printSTL

printПоточные классы

Поточные классы istream и ostream получаются инстанцированием классов-шаблонов для типа char:
typedef basic_ostream<char> ostream; // обычные символы
typedef basic_ostream<wchar_t> wostream; // широкие символы (например, Unicode)
Для ввода из файла или вывода в файл используются поточные классы ifstream, ofstream и fstream. При создании в первом аргументе передается строку с именем файла, для fstream нужно указать и второй аргумент – режим доступа. Деструктор автоматически закрывает файл.
Для неформатированного ввода и вывода удобно использовать объекты cin и cout, но при необходимости управлять форматированием проще воспользоваться printf и scanf.
Управление форматированием с помощью методов поточных классов
МетодНазначение
Управление форматированием
setf(flag)установка негрупповых флагов форматирования
setf(flag,group)установка флага из группы
unsetf(flag)сброс негрупповых флагов
fmtflags flags()текущие флаги
width(int)установка минимальной ширины поля,
после вывода значения ширина поля сбрасывается на 0
int width()текущая ширина поля
precision(int)установка максимального количества десятичных знаков
для вывода вещественных чисел
по умолчанию – 6
int precision()текущая точность
fill(char)установка символа заполнения
по умолчанию – ' '
int fill()текущий символ заполнения
Проверка и установка состояния
bool good()true, если ошибок не было
bool eof()true, если при выполнении последнего ввода был обнаружен конец файла
bool fail()true, если при выполнении последнего ввода была ошибка ввода-вывода
clear()очистить состояние ошибки для продолжения ввода
clear(ios::failbit)установить состояние ошибки
Посимвольный ввод-вывод
put(char)вывод символа
write(char* buf, int n)вывод n символов
flush()записать информацию из буфера на диск
get(char&)
int get()
ввод символа
read(char* buf, int n)ввод n символов
int peek()подсмотреть следующий символ, для конца файла возвращается EOF
putback(char)вернуть символ в поток
Позиционирование в файле
pos_type tellg()получить текущую позицию чтения
seekg(pos_type)
seekg(off_type,seek_dir)
установить позицию чтения
pos_type tellp()получить текущую позицию записи
seekp(pos_type)
seekp(off_type,seek_dir)
установить позицию записи
Открытие и закрытие файлов (классы ifstream, ofstream, fstream)
open(char *name)
open(char *name, mode)
открыть файл, где mode комбинируется из флагов in, out, app, ate, trunc, binary
close()закрыть файл

Группы и флаги определены в базовом классе ios
ФлагЗначение
Группа basefield – система счисления для целых чисел
decдесятичная
octвосьмеричная
hexшестнадцатеричная
Группа floatfield – формат представления для вещественных чисел
fixedс фиксированной точкой
scientificв экспоненциальной форме
Группа adjustfield – выравнивание в поле вывода
rightвправо
leftвлево
internalзнак числа – слева, значение – справа
Без группы
showbaseвыводить 0x перед шестнадцатеричными и 0 перед восьмеричными числами
showpointвсегда выводить . и дробную часть
uppercaseвыводить шестнадцатеричные цифры и E в вещественных числах в верхнем регистре
showposвыводить знак числа для положительных чисел
boolalphaвыводить значения bool как true и false
skipwsигнорирование пробелов при вводе символов с помощью операции >>
// вывод целого числа в шестнадцатеричном виде с ведущими нулями
int x=123;
cout.setf(ios::hex,ios::basefield);
cout.setf(ios::uppercase);
cout.width(8);
cout.fill('0');
cout<<x<<"\n";
cout.fill(' ');
// вывод вещественного числа в поле шириной 10 с 2 десятичными знаками
double f=12.3;
cout.setf(ios::fixed,ios::floatfield);
cout.setf(ios::showpoint);
cout.width(10);
cout.precision(2);
cout<<f<<"\n";
Вывод с помощью printf (для сравнения)
// вывод целого числа в шестнадцатеричном виде с ведущими нулями
int x=123;
printf("%08X\n",x); 
// вывод вещественного числа в поле шириной 10 с 2 десятичными знаками
double f=12.3;
printf("%10.2lf\n",f); 
Управление форматированием с помощью манипуляторов из <iomanip>
МанипуляторНазначение
setw(w)установка ширины поля вывода
setprecision(p)установка количества десятичных знаков
для вывода вещественных чисел
setfill(c)установка символа заполнения
flushзаписать информацию из буфера на диск
endlвывести переход на новую строку, а затем выполнить flush
dec oct hexвыбор системы счисления для целых чисел
right left internalвыравнивание в поле вывода
fixed scientificформат представления для вещественных чисел
showbase noshowbase
showpoint noshowpoint
showpos noshowpos
установка и сброс соответствующих флагов форматирования
Полезный совет
Использование endl существенно замедляет работу программы, так как для каждой строки выполняется принудительный вывод буфера в файл (это полезно только для ведения лога действий программы). Поэтому вместо endl лучше использовать '\n' или "\n".
// вывод целого числа в шестнадцатеричном виде с ведущими нулями
int x=123;
cout<<hex<<uppercase<<setw(8)<<setfill('0')<<x<<setfill(' ')<<"\n";
// вывод вещественного числа в поле шириной 10 с 2 десятичными знаками
double f=12.3;
cout<<fixed<<showpoint<<setw(10)<<setprecision(2)<<f<<"\n";
Управление форматированием в С++20
// вывод целого числа в шестнадцатеричном виде с ведущими нулями
int x=123;
cout<<format("{:08X}\n",x);
// вывод вещественного числа в поле шириной 10 с 2 десятичными знаками
double f=12.3;
cout<<format("{:10.2f}\n",f);
loading