Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бьерн Страуструп C++.doc
Скачиваний:
15
Добавлен:
07.11.2018
Размер:
2.45 Mб
Скачать

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 и g нужны, поскольку мы можем создать производный класс iostreams из классов ostream и istream, и в нем необходимо следить за позициями ввода и вывода.

С помощью функции peek() программа может узнать следующий символ, подлежащий вводу, не затрагивая результата последующего чтения. С помощью функции putback(), как показано в $$10.3.3, можно вернуть ненужный символ назад в поток, чтобы он был прочитан в другое время.