Вы можете использовать ungetc()
, возможно, вот так:
int fpeekc(FILE *fp)
{
int c = getc(fp);
if (c != EOF)
ungetc(c, fp);
return c;
}
Тщательное чтение спецификации POSIX означает, что вы можете вызвать ungetc()
с EOF, и вызов будетигнорируется, поэтому нет необходимости на 100% выполнять тест в функции fpeekc()
, но он приводит к сбою ungetc()
и возврату EOF.Если вам нравится жить - опасно или компактно;сделайте свой выбор - вы можете использовать:
int fpeekc(FILE *fp)
{
return ungetc(getc(fp), fp);
}
И, если хотите, вы можете сделать это встроенной функцией.Если вы работаете в POSIX и хотите быть поточно-ориентированным, вы можете использовать:
int fpeekc(FILE *fp)
{
flockfile(fp);
int c = getc_unlocked(fp); // Legitimate because of flockfile(); getc(fp) works too
if (c != EOF)
{
// ungetc_unlocked() is not defined by POSIX but is available on
// some but not all POSIX-like systems. See comments below.
ungetc(c, fp);
}
funlockfile(fp);
return c;
}
, который предотвращает взаимодействие другого потока с потоком во время работы над ним.См. Также обсуждение с Номинальное животное в комментариях ниже.
И вы можете использовать:
static inline int peekc(void) { return fpeekc(stdin); }
, если вы хотите сделать это для стандартного ввода.