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" kann

    hier 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 😃


Anmelden zum Antworten