Как получить значение указателя файла без перехода к следующему местоположению указателя файла (в C) - PullRequest
0 голосов
/ 28 октября 2011

Есть ли способ найти символ, сохраненный в указателе файла без fgetc. Скажем, у меня есть слово "steve jobs" в файле с именем apple.txt, есть что-то вроде

int main(int argc,char *argv[])
  {
   FILE *fp=fopen("apple.txt","r");
   if(fp=='s'&&(fp+2)=='e')
     printf("steve is there");
   else
     printf("Steve not there");
   fclose(fp);
  }

Очевидно, что это на самом деле не работает! Он просто печатает что-то вроде C, запрещает сравнение b / n указателя n int. Даже если я попытался добавить * перед (fp + 2) и fp, он сказал, что нет совпадения для оператора ==

Я полагаю, что функция fgetc (FILE *) работает таким образом, что получает беззнаковый символ, а затем перемещает указатель на следующую позицию. Есть ли какая-либо функция, позволяющая просто получить символ без перемещения указателя, а также возможен ли вышеуказанный код любым другим способом?!

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

«Символ, хранящийся в указателе файла», не имеет смысла запрашивать. Не обязательно какие-либо символы хранятся в 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, что означает «это не файл, это поток данных, в нем нельзя прыгать».

4 голосов
/ 28 октября 2011

Вы можете использовать getc и ungetc. Прочитайте документацию об этом (у вас может быть только один символ возврата).

В некоторых системах (особенно в системах Posix, таких как Linux) у вас есть возможность отобразить в памяти часть файла. Узнайте больше о системном вызове mmap , который позволяет просматривать часть файла как сегмент памяти. (mmap не может использоваться для файлов без возможности поиска, таких как каналы или сокеты; в основном он работает в основном с файлами "disk").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...