• Функция unget()
создает резервную копию входного потока, чтобы независимо от того, какое значение было последним возвращенным, оно все еще оставалось в потоке. Функцию unget()
можно вызвать, даже не зная, какое значение было извлечено из потока последним.
• Функция putback()
— это более специализированная версия функции unget()
: она возвращает последнее прочитанное из потока значение, но получает аргумент, который должен совпадать с последним прочитанным значением.
Таким образом, они гарантируют возможность вернуть в поток как минимум одно значение перед следующим чтением. Следовательно, гарантированно не получится вызвать функции putback()
или unget()
последовательно, без промежуточной операции чтения.
int
из операций вводаФункция peek()
и версия функции get()
без аргументов возвращают прочитанный символ из входного потока как значение типа int
. Этот факт может удивить; казалось бы, более естественным было бы возвращение типа char
.
Причина возвращения этими функциями типа int
в том, чтобы позволить им возвратить маркер конца файла. Полученный набор символов позволяет использовать каждое значение в диапазоне типа char
и представлять фактические символы. Но в этом диапазоне нет никакого специального значения для представления конца файла.
Функции, возвращающие тип int
, преобразуют возвращаемый символ в тип unsigned char
, а затем преобразуют это значение в тип int
. В результате, даже если в наборе символов будут символы, соответствующие отрицательным значениям, возвращенный этими функциями тип int
будет иметь положительное значение (см. раздел 2.1.2). Библиотека использует отрицательное значение для представления конца файла, гарантируя таким образом его отличие от любого настоящего символьного значения. Чтобы не обязывать разработчиков знать фактическое возвращаемое значение, заголовок iostream
определяет константу EOF
, которую можно использовать для проверки, не является ли возвращенное функцией get()
значение концом файла. Вот почему для содержания значения, возвращаемого этими функциями, используется переменная типа int
.
int ch; //
//
while ((ch = cin.get()) != EOF)
cout.put(ch);
Эта программа работает так же, как и прежняя, но здесь для чтения ввода используется функция get()
.