2013-05-21 1 views
1

У меня есть код, используя cin.get(input, c) где c - символ разделителя. Он не срабатывает в редких случаях, потому что в качестве спасения используется другой символ. Итак, если c следует e, я хочу cin.get, чтобы перейти к следующему c, а не экранированному c.cin.get with escape character

В настоящее время я проверяю, есть ли последний символ из cin.get и, если да, добавьте еще cin.get. Есть ли способ добавить escape-символ в cin.get, поэтому мне не нужна дополнительная проверка для escape-символа?

+3

Короткий ответ: нет. –

+1

Вы хотите, чтобы вы прочитали символ, и если это обратная косая черта, тогда прочитайте другой символ и преобразуйте эти два символа в код escape-кода символа C++? Если это так, то нет, вы не можете этого сделать. По крайней мере, не с одним вызовом 'get', вам нужно два. –

ответ

3

Если вам нужно поведение, подобное этому, вам необходимо реализовать его самостоятельно. Он не встроен в cin.get.

По крайней мере теоретически библиотека iostreams предоставляет место, в котором было бы разумно подключить эту логику, поэтому она будет действовать как часть потока. В частности, iostream имеет связанный с ним locale и использует фасет locale codecvt для преобразования из внешних представлений символов в файл во внутреннее представление символов, поскольку они будут видны вашей программой. Вы может сделать это преобразование в обычай codecvt фасет.

У этого есть довольно значительная проблема, хотя - написание факела codecvt довольно болезненно. Попытка написать это преобразование как грань codecvt вместо выполнения задания после прочтения - это примерно удвоить количество кода и, по крайней мере, утроить количество трудностей.

Эта инвестиция может погасить - упаковка преобразования в фасет codecvt может упростить интеграцию в несколько программ. Если вы действительно хотите использовать это конкретное преобразование во многих программах, его упаковка в фасет может иметь смысл. Если (как я предполагаю, это так), вы вряд ли будете использовать его в других программах, это возможно не стоит проблем.