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

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

2 ответа

Решение

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

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

редактировать
Нету. Это выглядит как unget() может пойти так далеко, как putback(),

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

streambuf:: sungetc

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

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

Другой:

streambuf:: sputbackc

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

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

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

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

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

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

Другие вопросы по тегам