lfind datei mehrmals durchlaufen
-
Habe ein problem mit lfind und zwar sollte das Programm in einer Datei nach einem "Key" suchen und nach durchlaufen der Datei angeben wie oft der Key gefunden wurde
leider gibt lfind immer die adresse auf den ersten "Treffer" zurück und nun weiß ich nicht wie ich "weitersuchen" kannhier mal mein bisheriger Code
#include <stdio.h> #include <search.h> int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main () { int key = 1; int *result; char buff[512]; //puffer anlegen int array[512]; //array anlegen size_t i = 0; int j; size_t counter = 0; FILE* datei; datei = fopen("test.txt", "r"); //Datei erzeugen while(!feof(datei)) //Datei bis zum Ende durchlaufen { fgets(buff, 512, datei); //Dateiinhalt zeichenweise in Puffer schreiben array[i++] = atoi(buff); //Dateiinhalt ins Array } fclose(datei); --i; //Stringendezeichen rausnehmen for(j = 0; j < i; j++) { result = (int *)lfind (&key, &array, &i, sizeof (int), (int(*) (const void *, const void *)) compare); if (result!=NULL) { counter++; printf ("%d gefunden\n",*result); fprintf(stdout, "ihre Suche war %d mal erfolgreich\n", counter); } else printf ("Suche nicht erfolgreich\n",key); } return 0; }
gesucht wird nach der Zahl 1 - in der Datei test.txt befindet sich die Zahl 4x
da die Datei im Array gespeichert ist hab ich auch probiert im Array einfach eine Stelle weiter zu gehen und erneut zu suchen hat aber leider auch nicht geklappt nun weiß ich nicht mehr weiter
mfg Alex
-
du hast ne subtraction -, keine compare - funktion. so eine funktion für eine einfache, lineare suche zu benutzen ist wie mit kanonen auf spatzen zu schiessen.
-
was könnte man stattdessen verwenden?
-
int compare (const void *a, const void *b) { if (*(int*)a == *(int*)b) return 0; else return 1; } int my_lfind (int* array, int elems, int key) { int i=0, n=0; while (i<elems) { if(array[i++] == key) n++; } return n; } int main (void) { int *found = NULL; int arr[3] = {1,1,2}; int key = 1; int n = 3; printf("%d", my_lfind(arr,3,1)); found = arr; while ( NULL != (found = _lfind(&key, found, &n, sizeof(int), compare))) { printf("found %d\n", *found); found ++; } return 0; }
Hmmm ... du müsstest deine compare Funktion etwas ändern und auch den Aufruf von lfind. lfind gibt immer nur ein Ergebnis zurück, oder NULL; ist es nicht NULL, kannst du den zurückgegebenen Zeiger inkrementieren und erneut als Argument für lfind benutzen.
Ich würde aber lieber eine eigene Funktion schreiben, ähnlich wie obige my_lfind.
Gruß,
c.
-
danke
habs jetzt selbst geschafft eigentlich nur ne weitere forschleife drum gepackt de compare funktion bleibt die gleiche