Стандарт C99 (и стандарт C89 до этого) однозначно сказал:
Один символ отталкивания гарантирован. Если функция ungetc
вызывается слишком много
раз в том же потоке без промежуточной операции чтения или позиционирования файла на этом
поток, операция может завершиться неудачей.
Таким образом, чтобы быть переносимым, вы не должны предполагать более одного символа возврата.
Сказав, что на MacOS X 10.7.2 (Lion) и RHEL 5 (Linux, x86 / 64) я попытался:
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 4096; i++)
{
int c = i % 16 + 64;
if (ungetc(c, stdin) != c)
{
fprintf(stderr, "Error at count = %d\n", i);
return(1);
}
}
printf("No error up to count = %d\n", i-1);
return(0);
}
У меня нет ошибок ни на одной платформе. Напротив, в Solaris 10 (SPARC) я получил сообщение об ошибке «count = 4». Хуже того, в HP-UX 11.00 (PA-RISC) и HP-UX 11.23 (Itanium) я получил ошибку при 'count = 1', опровергающую теорию о том, что 2 безопасно. Точно так же AIX 6.0 выдал ошибку при 'count = 1'.
Резюме
- Linux: большой (4 КиБ)
- MaxOS X: большой (4 КиБ)
- Солярис: 4
- HP-UX: 1
- AIX: 1
Таким образом, AIX и HP-UX допускают только один символ pushback для входного файла, для которого не было прочитано никаких данных. Это неприятный случай; они могут обеспечить гораздо большую емкость отката после считывания некоторых данных из файла (но простой тест на AIX, добавляющий getchar()
до того, как цикл не изменил емкость отката).