Существует ли "unput" для std :: ostream, как существует "unget" для std :: istream? - PullRequest
3 голосов
/ 11 декабря 2010

У меня есть некоторый код синтаксического анализа, который позволяет вводить 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. Вы можете сделать такую ​​вещь? Если функция не существует, существует ли простой способ отодвинуть позицию записи назад на один символ и просто прочитать следующий символ, перезаписав ее?

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

Ответы [ 4 ]

9 голосов
/ 11 декабря 2010

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

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

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

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

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

1 голос
/ 11 декабря 2010

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

0 голосов
/ 11 декабря 2010

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

0 голосов
/ 11 декабря 2010

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

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);
}

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

...