2016-10-25 2 views
0

Я работаю над некоторым кодом для домашнего задания, которое предназначено для поиска текстового файла для определенных шаблонов и создания отчетов. В настоящее время для тестирования я просто печатаю свои отчеты на экране. Но моя функция поиска работает только в первый раз. Я тестировал регулярное выражение индивидуально, и они все вытягивают правильные совпадения, но как только я помещаю его в функцию, он работает только при первом запуске. Может ли кто-нибудь объяснить мне, почему это происходит?Почему моя функция регулярного выражения работает только в первый раз?

#include <stdio.h> 
#include <stdlib.h> 
#include <regex.h> 


// Report expressions 
char *reports[5] = {"^ {0,}[0-9]{1,4}", "S", "L", "S {0,1}(1|2)", "^ {0,}[0-9]{1,4} {1,} L | 3$"}; 

void search(FILE *fp, char *report, int index) { 
     regex_t reg; 
     char buf[256]; 
     int reti = regcomp(&reg,report,REG_EXTENDED); 

     if(reti) { 
       printf("Regex compilation failed, noob\n"); 
       exit(1); 
     } 
     printf("Report %d\n", index); 

     while(fgets(buf,sizeof(buf),fp) != NULL) { 
       //printf("%s",buf); 
       reti = regexec(&reg,buf,0,NULL,0); 
       if(!reti) { //if there's a match 
         printf("%s",buf); 
       } else if(reti == REG_NOMATCH) { 
         printf("No match\n"); 
       } 
     } 

     regfree(&reg); 
} 

int main(void) { 
     FILE *fp; 

     fp = fopen("./Hammer.data","r"); 

     if(fp == NULL) { 
       perror("Error opening file"); 
       return(-1); 
     } 

     for(int i = 0;i < 5;i++) { 
      search(fp, reports[i],i+1); 
     } 

     fclose(fp); 

     return(0); 
} 

ответ

1
while(fgets(buf,sizeof(buf),fp) != NULL) 

Это приведет к fp, указывающий на конец файла. Поэтому в следующий раз, когда функция будет вызвана, fgets немедленно вернет NULL. Одним из исправлений является rewind указатель файла перед циклом fgets.

+0

Это сработало, я очень благодарен за это! –