Инициализация Потоков Ввода
Естественно, тип istream, так же как и ostream, снабжен конструктором:
class istream { // ... istream(streambuf* s, int sk =1, ostream* t =0); istream(int size, char* p, int sk =1); istream(int fd, int sk =1, ostream* t =0); };
Параметр sk задает, должны пропускаться пропуски или нет. Параметр t (необязательный) задает указатель на ostream, к которому прикреплен istream. Например, cin прикреплен к cout; это значит, что перед тем, как попытаться читать символы из своего файла, cin выполняет
cout.flush(); // пишет буфер вывода
С помощью функции istream::tie() можно прикрепить (или открепить, с помощью tie(0)) любой ostream к любому istream. Например:
int y_or_n(ostream& to, istream& from) /* "to", получает отклик из "from" */ { ostream* old = from.tie(&to); for (;;) { cout << "наберите Y или N: "; char ch = 0; if (!cin.get(ch)) return 0; if (ch != "\n") { // пропускает остаток строки char ch2 = 0; while (cin.get(ch2) && ch2 != "\n") ; } switch (ch) { case "Y": case "y": case "\n": from.tie(old); // восстанавливает старый tie return 1; case "N": case "n": from.tie(old); // восстанавливает старый tie return 0; default: cout << "извините, попробуйте еще раз: "; } } }
Когда используется буферизованный ввод (как это происходит по умолчанию), пользователь не может набрав только одну букву ожидать отклика. Система ждет появления символа новой строки. y_or_n() смотрит на первый символ строки, а остальные игнорирует.
Символ можно вернуть в поток с помощью функции istream::putback(char). Это позволяет программе "заглядывать вперед" в поток ввода.
1 2 3 4
8 8 8
|