проблема позиционирования FILE * с помощью fseek - PullRequest
0 голосов
/ 29 мая 2011

Я пытаюсь выполнить упражнение K & R (7.7). Он просит написать программу, которая принимает имена файлов в качестве аргументов и ищет их по определенному шаблону. Для сопоставления с образцом я использую подход скользящего окна, то есть проверяем первыйn символов для сопоставления, а затем сдвиньте «окно» (я использую массив) на одно место вправо и проверяйте снова и так до тех пор, пока не получите EOF. Я считаю, что я не использую fseek должным образом. Я делаю это неправильно?

#include <stdio.h>
#include <string.h>

int pattern_check(FILE *);

char *pattern="dog";

int
main(int argc,char **argv)
{
    FILE *fp;
    char *file_name;
    int i;
    int matchings;

    for(i=1;i<argc;i++){
        file_name=strdup(argv[i]);
        fp=fopen(file_name,"r");
        if((matchings=pattern_check(fp))){
            printf("%d patterns found in %s\n",matchings,argv[i]);
        }
        fclose(fp);


    }
    system(sleep(10000));
    return 0;
}

int
pattern_check(FILE *fp)
{
    int length=strlen(pattern);
    char window[length];
    int i,c;
    int found=0;
    unsigned position=ftell(fp);


    window[length]='\0';
    while(1){
        /*load characters from file to string*/
        for(i=0;i<length;i++){
            fscanf(fp,"%c",&c);
            window[i]=c;
        }
        /*compare*/
        if(strcmp(window,pattern)==0)
            found++;
        if(feof(fp))
            break;
        /*move window one to the right*/
        fseek(fp,0,position);
        position+=1;

    }
    return found;
 }

заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 29 мая 2011
fseek (fp, 0, position);

, безусловно, неправильно, аргументы для fseek должны быть:

  • дескриптор файла.
  • позиция.
  • «откуда» (откуда рассчитывается позиция).

Другими словами, это должно быть:

fseek (fp, position, SEEK_SET);

И, кроме того, как правило, вы всегда должны проверять код возврата из функций, которые могут завершиться сбоем, даже если вы не думаете, что это произойдет. И вы можете сделать position a long int в соответствии с текущим стандартом. Вероятно, это не будет иметь никакого значительного значения для небольших файлов, но у вас возникнут проблемы, когда вы начнете обрабатывать файлы, размер которых больше, чем могут обрабатывать ваши обычные целые числа.

2 голосов
/ 29 мая 2011

Аргументы для fseek () задом наперед?

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