«Символ, хранящийся в указателе файла», не имеет смысла запрашивать. Не обязательно какие-либо символы хранятся в FILE
. Например, stdin
и stdout
часто являются каналами связи, а не файлами на диске, и они могут вообще не выполнять какую-либо буферизацию.
Что вы можете сделать вместо этого, если вы знаете, a FILE
относится к реальному файлу на диске, а не к каналу связи, считывает несколько символов и затем использует fseek
для возврата назад туда, где вы были, прежде чем читать их. Ваша программа-пример, переписанная для этого, будет выглядеть примерно так:
int main(void)
{
FILE *fp = fopen("orange.txt", "r")
if (!fp)
{
perror("fopen(orange.txt)");
return 1;
}
if (getc(fp) == 'b' &&
getc(fp) == 'a' &&
getc(fp) == 'n' &&
getc(fp) == 'a' &&
getc(fp) == 'n' &&
getc(fp) == 'a')
puts("orange has a banana");
else
puts("orange has no bananas");
/* return to the beginning of the file */
if (fseek(fp, 0, SEEK_SET))
{
perror("fseek(orange.txt)");
return 1;
}
/* do something else with `fp` here */
/* all files are automatically closed on exit */
return 0;
}
Если вы работаете с файлом, характер которого вам неизвестен - например, любой файл , данный вам пользователем - вы должны быть готовы к fseek
потерпите неудачу и установите для errno
значение ESPIPE
, что означает «это не файл, это поток данных, в нем нельзя прыгать».