<< "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n'
<< setfill(' '); //
Вывод этой программы таков:
i: -16next col
d: 3.14159next col
i: -16 next col
d: 3.14159 next col
i: -16next col
d: 3.14159next col
i: - 16next col
d: 3.14159next col
i: -#########16next col
d: #####3.14159next col
По умолчанию операторы ввода игнорируют символы отступа (пробел, табуляция, новая строка, новая страница и возврат каретки).
char ch;
while (cin >> ch)
cout << ch;
Этот цикл получает следующую исходную последовательность:
a b с
d
Он выполняется четыре раза, читая символы от а
до d
, пропуская промежуточные пробелы, возможные символы табуляции и новой строки. Вывод этой программы таков:
abcd
Манипулятор noskipws
заставляет оператор ввода читать, не игнорируя отступ. Для возвращения к стандартному поведению применяется манипулятор skipws
:
cin >> noskipws; //
while (cin >> ch)
cout << ch;
cin >> skipws; //
При том же вводе этот цикл делает семь итераций, читая отступы как символы во вводе. Его вывод таков:
a b с
d
Упражнение 17.34. Напишите программу, иллюстрирующую использование каждого манипулятора из табл. 17.17 и 17.18.
Упражнение 17.35. Напишите версию программы вывода квадратного корня, но выводящую на сей раз шестнадцатеричные цифры в верхнем регистре.
Упражнение 17.36. Измените программу из предыдущего упражнения так, чтобы различные значения с плавающей точкой выводились в столбце.
17.5.2. Не форматированные операции ввода-вывода
До сих пор в программах использовались только операции <<
и >>
) форматируют читаемые и выводимые данные согласно их типу. Операторы ввода игнорируют отступ; операторы вывода применяют дополнение, точность и т.д.
Библиотека предоставляет также набор низкоуровневых функций
Некоторые из не форматированных операций имеют дело с обработкой потока по одному байту за раз. Они описаны в табл. 17.19 и читают данные, не игнорируя отступ. Например, функции не форматированного ввода-вывода get()
и put()
позволяют читать и записывать символы по одному:
char ch;
while (cin.get(ch))
cout.put(ch);
Эта программа сохраняет отступ во вводе. Ее вывод идентичен вводу. Она работает так же, как и предыдущая программа, использовавшая манипулятор noskipws.
Таблица 17.19. Однобайтовые низкоуровневые функции ввода-вывода
is.get(ch) | Помещает следующий байт из потока is класса istream в символьную переменную ch . Возвращает поток is |
os.put(ch) | Помещает символ ch в поток os класса ostream . Возвращает поток os |
is.get() | Возвращает следующий байт из потока is как тип int |
is.putback(ch) | Помещает символ ch назад в поток is ; возвращает поток is |
is.unget() | Перемещает в поток is один байт; возвращает поток is |
is.peek() | Возвращает следующий байт как тип int , но не удаляет его |
Иногда необходимо читать отдельные символы так, чтобы знать, к чему быть готовым. В таких случаях символы желательно возвращать в поток. Библиотека предоставляет три способа сделать это, и у каждого из них есть свои отличия.
• Функция peek()
возвращает копию следующего символа во входном потоке, но не изменяет поток. Возвращенное значение остается в потоке.