2016-10-25 6 views
0

Ich arbeite an etwas Code für eine Hausaufgabe, die eine Textdatei für bestimmte Muster suchen und Berichte erstellen soll. Um es zu testen, drucke ich gerade meine Berichte auf dem Bildschirm. Aber meine Suchfunktion scheint nur das erste Mal zu laufen. Ich habe die Regex einzeln getestet und sie ziehen alle die richtigen Übereinstimmungen, aber sobald ich sie in die Funktion einfüge, funktioniert sie nur beim ersten Mal. Kann mir jemand erklären, warum das passiert?Warum läuft meine Regex-Funktion nur beim ersten Mal?

#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); 
} 

Antwort

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

, die in den fp bis zum Ende der Datei verweist führen. Wenn also die Funktion das nächste Mal aufgerufen wird, gibt fgets sofort NULL zurück. Eine Lösung ist rewind der Dateizeiger vor der fgets Schleife.

+0

Das hat funktioniert, ich danke Ihnen sehr, ich schätze es sehr! –

Verwandte Themen