Zeilenanzahl aus externem File



  • Hallo Leute,
    ich bin am Verzweifeln. Ich steh sowas von auf dem Schlauch! ich brauche von einem externen File die Anzahl der Zeilen. Ich hab schon eine Lösung für das Auswählen einzelner Zeilen, aber wie ich die Anzahl bekommt krieg ich nicht hin.
    Vielleicht könnt ihr mir helfen. Vielleicht hilft mir jetzt auch erstmal die Mittagspause 😉
    Hier ist mein Code für die Zeilenauswahl:

    char *choose_line(int n, FILE *file)
    {
       char temp[BUF];
       char puffer[BUF];
       int i;		
         for(i=0; i<n-1; i++)
            if(fgets(temp, BUF, file) == NULL)  /*reading until line n*/
    
    	  return NULL; /*line apparently does not exist*/
    
            if(fgets(puffer,BUF,file) == NULL) /*stream is now at line n*/
    
              return NULL;  /*line apparently does not exist*/
    
         return puffer; 
    }
    


  • Die sicherste Methode ist, dass du die komplette Datei einliest und dann die \n zählst. Wenn du allerdings davon ausgehen kannst, dass fgets() immer eine komplette Zeile einliest (In einer Zeile darf also nicht mehr als BUF - 2 stehen), dann kannst du gleich beim Einlesen mitzählen wieviele Schleifendurchläufe (also im Endeffekt Zeilen) du hast.



  • Hi AJ, danke dir!
    Ja mit dem ganzen text einlesen hab ich mir auch schon überlegt, mir war nur die fgets_Funktion so ins Auge gesprungen.
    Na gut, probier ichs mit der anderen Variante. Einfach über fscanf und dann mit for-schleife und if-Bedingung oder? Hab leider keine Bücher hier in denen ich mal spitzen könnte 😞



  • Ok, falls es jemanden interessiert, hab eine schöne Möglichkeit gefunden! Nach dem Mittagessen siehts einfach schon wieder ganz anders aus 😃

    {
       int line = 0, c;
    
         while((c=fgetc(file)) != EOF)
    
         {
           if (c=='\n')
           ++line;
         }
         return line;
    }
    


  • sieht ganz gut aus 🙂 wäre halt nur noch besser, in einem rutsch die ganze datei zu lesen (range-checking für dateigröße!!) und dann den speicher durchsuchen, geht wahrscheinlich noch ein stückl schneller



  • sorry bi blutiger c-Anfänger, was meinst du damit genau? Wie kann ich so ein Rangechecking machen? Bestimmt nicht mit sizeof oder???



  • nee, es geht drum, dass du, bevor du die komplette datei ausliest, mal überprüfts, wie groß die datei ist und da ein sinnvolles limit setzt (also z.B. 10 MB) bevor du einen entsprechenden puffer reservierst und dsa ganze ausliest...



  • Wie kann ich denn so ein Limit auf 10Mb setzen? Das Problem ist das ich nie genau weiß wie groß meine Datei wird da das Programm über mehrere Tage Daten produziert und erst dann ausgelesen werden soll...



  • Airness schrieb:

    Wie kann ich denn so ein Limit auf 10Mb setzen? Das Problem ist das ich nie genau weiß wie groß meine Datei wird da das Programm über mehrere Tage Daten produziert und erst dann ausgelesen werden soll...

    Lies einfach immer nur zB 1MB Blöcke.
    mit fwrite() kannst du recht einfach ganze Blöcke laden.



  • @Shade
    Du meinst fread(), oder?? 😉


Anmelden zum Antworten