Нажатие символов обратно на стандартный ввод в C

Скажем, входной поток (stdin) содержит «abc». Я хочу отодвинуть, скажем, 3 символа '*' на стандартный ввод, чтобы получить что-то вроде «***abc». я пытался использоватьungetc()(Я сделалungetc('*', stdin)) для этого, но я понял, что он гарантирует откат только на 1 символ, а потом может не получиться. Есть ли другой способ вернуть 3 (или любое известное N) количество символов обратно на стандартный ввод?

1 ответ

Нет портативного способа сделать это.

Тем не менее, большая часть реализации стандартной библиотеки C допускает множественные отказы в разумных пределах. Так что на практике это может и не быть проблемой.

Если вам нужна абсолютная гарантия, вам нужно написать собственную реализацию stdio. Это, безусловно, возможно, поскольку существуют реализации с открытым исходным кодом, которые вы можете модифицировать. Но это много работы. В качестве альтернативы вы можете использовать библиотеку FreeBSD, если она доступна для вашей платформы, поскольку она гарантирует возможность повторных вызовов ungetc. (Насколько мне известно, реализация GNU также допускает произвольные вызовы ungetc. Но документация этого не гарантирует.)

Некоторые библиотеки включают нестандартные интерфейсы, такие как fopencookie GNU , которые позволяют создавать потоки stdio с пользовательскими низкоуровневыми функциями чтения и записи. К сожалению, они не помогают в этом конкретном случае использования, который требует возможности настраивать реализацию буферов stdio. Так что это тупик; Я упоминаю об этом только потому, что на первый взгляд это может показаться правдоподобным.

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