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

Равиль Ярупов
Равиль Ярупов
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Евгений Чаленко
Евгений Чаленко
Россия, Новокузнецк, НФИ КемГУ
Антон Свитенков
Антон Свитенков
Беларусь, Речица