Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Существует ли unput для std::ostream, как существует unget для std::istream?

Автор вопроса: WillОтветов: 4

У меня есть код синтаксического анализа, который позволяет вводить escape-последовательности в строку текста:

// In a file or large, multi-line string ...
my_parameter="A setting for the parameter\nthat contains \"escape sequence\" characters"

Когда я анализирую его, я обрабатываю обратную косую черту и добавляю соответствующий символ в строку, которую я создаю, используя экземпляр std::ostringstream. Перевод строки, кавычки, обратная косая черта и тому подобное работают нормально. Тем не менее, я обдумывал, разрешать ли последовательность \b, и пошел посмотреть, смогу ли я "удалить" последний символ из моего ostringstream, как вы можете "удалить" из любого std::istream. Можешь ли ты сделать такое? Если функция не существует, есть ли простой способ отодвинуть позицию записи назад на один символ и просто перезаписать ее следующим символом?

Это не критично для миссии или что-то в этом роде, но мне было любопытно, сталкивался ли кто-нибудь еще с этим раньше.

c++iostream

Ответы

Ответ 1 · рейтинг 10 · SingleNegationElimination

Потоки очень похожи на почту. каждое сообщение, отправленное в потоке, подобно письму, и сообщения могут быть поставлены в очередь в буферах, которые подобны почтовым ящикам.

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

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

Скорее всего, вы на самом деле доставляете письмо в ящик, принадлежащий почтовому отделению (операционной системе). Хотя многие такие сосуды представляют собой просто мусорные ведра, и почтальон проверяет их раз в день, может случиться так, что слот подключен непосредственно к сортировочной машине, и письмо будет доставлено сразу же, как только вы его уроните.

В потоковом интерфейсе с параллелизмом нет общего способа вернуть право собственности на запись после ее записи. Если вам это нужно, вы должны поместить промежуточный буфер между вами и потоком и сбрасывать его в поток только тогда, когда вы наверняка знаете, что готовы.

Ответ 2 · рейтинг 1 · Juraj Blaho

Вы можете использовать seekp для установки позиции курсора в потоке (см.: http://cplusplus.com/reference/iostream/ostream/seekp/).

Ответ 3 · supercat

Если вы хотите забрать персонажа, не отправляйте его, пока не будете уверены, что не захотите забирать его обратно. Вы можете реализовать свою собственную логику "разрешить возврат" следующим образом:

int pending_ch = -1;
void output_char(int ch)
{
  if (pending_ch >= 0)
    putch(F, ch);
  pending_ch = ch;
}
void unput_char(void)
{
  pending_ch = -1;
}
void force_put_char(void)
{
  output_char(-1);
}

Немного неуклюжий, но этот общий подход может быть полезен для задержки вывода в поток.

Ответ 4 · Puppy

Вы можете просто ввести символ возврата самостоятельно. Я сделал это в консоли Windows, по крайней мере. Это должно гарантировать, что правильное поведение соблюдается независимо от пункта назначения.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы