У меня есть код синтаксического анализа, который позволяет вводить 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. Можешь ли ты сделать такое? Если функция не существует, есть ли простой способ отодвинуть позицию записи назад на один символ и просто перезаписать ее следующим символом?
Это не критично для миссии или что-то в этом роде, но мне было любопытно, сталкивался ли кто-нибудь еще с этим раньше.
Ответ 1 · рейтинг 10 · SingleNegationElimination
Потоки очень похожи на почту. каждое сообщение, отправленное в потоке, подобно письму, и сообщения могут быть поставлены в очередь в буферах, которые подобны почтовым ящикам.
Если бы вы отвечали как за отправку сообщений в почтовый ящик, так и за извлечение сообщений из него, то вы наверняка знали бы, что письмо, которое вы только что положили туда, все еще там, и вы можете забрать его обратно. Конечно, вы, вероятно, вообще не станете класть его в почтовый ящик, поскольку вы владеете обоими концами.
Если вместо этого вы кладете письмо в почтовый ящик своей подруги, у вас практически нет контроля над тем, когда она проверит свой почтовый ящик и достанет все письма. может быть, она сидит у двери и сразу же схватит письмо и прочтет его, как только оно пройдет через щель.
Скорее всего, вы на самом деле доставляете письмо в ящик, принадлежащий почтовому отделению (операционной системе). Хотя многие такие сосуды представляют собой просто мусорные ведра, и почтальон проверяет их раз в день, может случиться так, что слот подключен непосредственно к сортировочной машине, и письмо будет доставлено сразу же, как только вы его уроните.
В потоковом интерфейсе с параллелизмом нет общего способа вернуть право собственности на запись после ее записи. Если вам это нужно, вы должны поместить промежуточный буфер между вами и потоком и сбрасывать его в поток только тогда, когда вы наверняка знаете, что готовы.
Ответ 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);
}
Немного неуклюжий, но этот общий подход может быть полезен для задержки вывода в поток.