Опубликован: 10.10.2006 | Уровень: специалист | Доступ: свободно
Лекция 10:

Потоки

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(), как показано в \S 10.3.3, можно вернуть ненужный символ назад в поток, чтобы он был прочитан в другое время.

Равиль Ярупов
Равиль Ярупов
Привет !
Федор Антонов
Федор Антонов
Оплата и обучение
Геннадий Дуванов
Геннадий Дуванов
Россия