Потоки
10.4.2.1 Стандартные манипуляторы ввода-вывода
Это следующие манипуляторы:
// Simple manipulators: ios& oct(ios&); // в восьмеричной записи ios& dec(ios&); // в десятичной записи ios& hex(ios&); // в шестнадцатеричной записи ostream& endl(ostream&); // добавить '\n' и вывести ostream& ends(ostream&); // добавить '\0' и вывести ostream& flush(ostream&); // выдать поток istream& ws(istream&); // удалить обобщенные пробелы // Манипуляторы имеют параметры: SMANIP<int> setbase(int b); SMANIP<int> setfill(int f); SMANIP<int> setprecision(int p); SMANIP<int> setw(int w); SMANIP<long> resetiosflags(long b); SMANIP<long> setiosflags(long b);
Например,
cout << 1234 << ' ' << hex << 1234 << ' ' << oct << 1234 << endl;
напечатает
1234 4d2 2322
и
cout << setw(4) << setfill('#') << '(' << 12 << ")\n"; cout << '(' << 12 << ")\n";
напечатает
(##12) (12)
Не забудьте включить файл <iomanip.h>, если используете манипуляторы с параметрами.
10.4.3 Члены ostream
В классе ostream есть лишь несколько функций для управления выводом, большая часть таких функций находится в классе ios.
class ostream : public virtual ios { //... public: ostream& flush(); ostream& seekp(streampos); ostream& seekp(streamoff, seek_dir); streampos tellp(); //... };
Как мы уже говорили, функция flush() опустошает буфер в выходной поток. Остальные функции используются для позиционирования в ostream при записи. Окончание на букву p указывает, что именно позиция используется при выдаче символов в заданный поток. Конечно эти функции имеют смысл, только если поток присоединен к чему-либо, что допускает позиционирование, например файл. Тип streampos представляет позицию символа в файле, а тип streamoff представляет смещение относительно позиции, заданной seek_dir. Все они определены в классе ios:
class ios { //... enum seek_dir { beg=0, // от начала файла cur=1, // от текущей позиции в файле end=2 // от конца файла }; //... };
Позиции в потоке отсчитываются от 0, как если бы файл был массивом из n символов:
char file[n-1];
и если fout присоединено к file, то
fout.seek(10); fout<<'#';
поместит # в file[10].
10.4.4 Члены istream
Как и для ostream, большинство функций форматирования и управления вводом находится не в классе iostream, а в базовом классе ios.
class istream : public virtual ios { //... public: int peek() istream& putback(char c); istream& seekg(streampos); istream& seekg(streamoff, seek_dir); streampos tellg(); //... };
Функции позиционирования работают как и их двойники из ostream. Окончание на букву g показывает, что именно позиция используется при вводе символов из заданного потока. Буквы p (put) и g (get) нужны, поскольку мы можем создать производный класс iostreams из классов ostream и istream, и в нем необходимо следить за позициями ввода и вывода.
С помощью функции peek() программа может узнать следующий символ, подлежащий вводу, не затрагивая результата последующего чтения. С помощью функции putback(), как показано в 10.3.3, можно вернуть ненужный символ назад в поток, чтобы он был прочитан в другое время.