Подтвердить что ты не робот

Разница между putback() и unget()

Я использую стандартный iostream для ввода некоторого ввода из файла, и я запутался в unget() по сравнению с putback(character). Мне кажется, из документации, что эти функции фактически идентичны, где unget() просто помнит персонажа, и я нервничаю. Я всегда использовал putback(character), но character всегда является последним прочитанным символом, и я думал об изменении на unget(). Является ли putback(character) всегда идентичным unget(), если character всегда является последним прочитанным символом?

4b9b3361

Ответ 1

Вы не можете лежать с unget(). Он "забывает" последний прочитанный символ. Вы можете лежать с помощью putback(c). Вы можете "сбрасывать" какой-либо символ, кроме символа последнего чтения. Иногда полезно возвращать символ, отличный от последнего прочитанного символа.

Кроме того, если базовый буфер чтения действительно имеет возможность буферизации, вы можете "отбросить" более одного символа. Я думаю, что ungetc() ограничен одним символом.

Edit
Неа. Похоже, что unget() может вернуться еще putback().

Ответ 2

Это не ответ, который вы, вероятно, ожидаете, но хотите представить мои рассуждения. Документация остается, что методы putback и unget вызывают streambuf::sputbackc и streambuf::sungetc соответственно. Определения следующие:

streambuf:: sungetc

     

Перемещает указатель get на один символ назад, делая последний символ, полученный посредством операции ввода, доступной еще раз для следующей операции ввода.

     

Во время работы функция вызовет защищенную функцию виртуального участника pbackfail, если указатель get gptr указывает на ту же позицию, что и предыдущий eback.

Другой:

streambuf:: sputbackc

     

Указатель get перемещается назад, чтобы указать на символ перед его текущим положением, чтобы последний символ получил c, снова становится доступным в качестве символа, который будет считываться в этой позиции с помощью следующей операции ввода.

     

Во время своей работы функция вызывает защищенную функцию виртуального члена pbackfail либо, если символ c не соответствует gptr() [- 1], или если указатель get gptr указывает на ту же позицию, что и предыдущий eback./p >      

Если c не совпадает с символом в этой позиции, то по умолчанию для pbackfail в streambuf будет указано, что c будет символом, извлеченным в этой позиции, если возможно, но производные классы могут переопределить это поведение.

     

Функция-член sungetc ведет себя аналогичным образом, но без принятия какого-либо параметра

Как sputbackc вызывает pbackfail, если символ не совпадает, значит, метод должен проверить, равны ли значения. Похоже, что дополнительная проверка - это только накладные расходы, но понятия не имею, как она решается на практике. Я могу представить, что если последний символ не хранится в объекте, он должен быть перечитан, поэтому вы можете ожидать его, даже если символы гарантированно будут одинаковыми.

Меня немного беспокоила ситуация, когда мы называем unget, но последний символ недоступен. Правильно ли значение putback присвоит значение? Я сомневаюсь, но это не должно происходить при работе с файлами.