Zeile - Anzahl Zeichen



  • Hi,

    Ich möchte eine Datei zeilenweise auslesen und zeilenweise ausgeben. Dafür möchte ich fgets() verwenden. Das Problem jedoch ist : Ich muss wissen wieviel Zeichen es in einer Zeile maximal vorhanden sind. Wie kann ich dieses Problem portabel und für beliebig viele Zeichen pro Zeile lösen? Ich hoffe auf eure Hilfe.

    liebe grüße



  • Erst mal Pufferspeicher besorgen.
    Zeile einlesen.
    Wenn so viel gelesen wurde, wie der Pufferspeicher groß ist, schauen ob ein '\n' im Puffer ist.
    Wenn nein, mehr Speicher besorgen (realloc) und nochmal lesen.

    Wo soll die Ausgabe denn hingehen?
    Auf die Konsole? Dann sollten als Puffer 200 Zeichen reichen.



  • Wofür brauchst du denn die Anzahl der Zeichen in einer Zeile? Also so könnte man das machen:

    int main()
    {
      FILE *file = fopen("test.txt", "r");
      if (file)
      {
        char buf[2]; // Natürlich größer machen! :rolling_eyes: 
        int chars = 0;
        while (fgets(buf, sizeof(buf), file))
        {
          printf("%s", buf);
          chars += strlen(buf);
          if (buf[strlen(buf) - 1] == '\n')
          {
            printf("Zeichen in Zeile: %i\n", chars - 1);
            chars = 0;
          }
        }
        printf("\nZeichen in Zeile: %i\n", chars);
      }
      fclose(file); // Edit :)
    }
    

    Wobei "beliebig viele" natürlich durch den größten Integer-Typen des Systems festgelegt wird.



  • cooky451 schrieb:

    Wofür brauchst du denn die Anzahl der Zeichen in einer Zeile? Also so könnte man das machen:

    ...
    hier folgt suboptimaler Code
    

    Was soll das denn hier?
    Die Fragestellung war doch wohl eindeutig, da stand was von zeilenweiser Ausgabe, was du hier (suboptimal) machst, ist zeichenweise Ausgabe.
    Was soll file in while, wo ist fclose?

    Hier mal eine Variante zum o.g. realloc-Szenario, je nach Sorgfalt des Compiler/Bibliotheksbauers bei realloc sogar ziemlich schnell für große Dateien.
    Aufpassen noch bei Lineendconvention für DOS/Win <--> Unix/Mac.

    char* liesGanzeZeile(FILE *f,char **r)
    {
      char t[100];
      **r=0;
      while( fgets(t,100,f) )
      {
        char *p=strchr(t,'\n');
        if( p ) *p=0;
    
        *r=realloc(*r,1+strlen(*r)+strlen(t));
        strcat(*r,t);
    
        if( p ) return *r;
      }
      return **r?*r:0;
    }
    
    int main()
    {
      char *z,*b=malloc(100);
      FILE *f = fopen("bla.txt","r");
    
      while( z=liesGanzeZeile(f,&b) ) puts(z);
    
      fclose(f);
      free(b);
    
      return 0;
    }
    


  • Wutz schrieb:

    Was soll das denn hier?
    Die Fragestellung war doch wohl eindeutig, da stand was von zeilenweiser Ausgabe, was hier (suboptimal) machst, ist zeichenweise Ausgabe.
    Was soll file in while, wo ist fclose?

    while und fclose sind irgendwie verloren gegangen, als ich das mal editiert habe.
    Und ich glaube wenn du den Puffer entsprechend groß machst kann man nicht wirklich von "zeichenweise" sprechen. Ist allemal angenehmer, als den ganzen Kram in den Speicher zu hiefen, vor allem wenn man primär an der Länge der Zeile und deren Ausgabe interessiert ist.



  • Also, dass die "suboptimale" Lösung schon zum anpassen gedacht war, hab ich dann auch herausgefunden. Außerdem wird die Lösung ja schon "suboptimal" genannt.

    @Wutz: So optimal ist dein Ansatz auch nicht.
    Es fehlt die Prüfung ob malloc bzw. realloc ühaupt Speicher anlegt(die Schnipsel müsste man halt noch anpassen und einfügen):

    if(pOutput=malloc(iOutputLength)) { 
        strcpy(pOutput=pCheck, Temp);
      } else { // nicht genug Speicher vorhanden
        return NULL;
      }
    
    if(pCheck=realloc(pOutput, iOutputLength)) { 
        strcat(pOutput=pCheck, Temp);
      } else { // nicht genug Speicher vorhanden
        free(pOutput);
        return NULL;
      }
    


  • DaRe schrieb:

    @Wutz: So optimal ist dein Ansatz auch nicht.
    Es fehlt die Prüfung ob malloc bzw. realloc ühaupt Speicher anlegt(die Schnipsel müsste man halt noch anpassen und einfügen):

    Du weißt nicht, was ein Ansatz ist und wodurch sich dieser von konkreter Implementierung unterscheidet.
    Mein "Ansatz" konkretisiert den von DirkB zuvor genannten realloc-"Ansatz", und wenn du lesen kannst, hast du sicher auch das Wort "Variante" gelesen, was ebenso wie "Ansatz" in der deutschen Sprache eine Sinnverwandtschaft mit "Vorschlag" eingeht und weniger bis gar nichts mit der von dir apostrophierten "ultimativen Gesamtlösung".



  • Wutz schrieb:

    DaRe schrieb:

    @Wutz: So optimal ist dein Ansatz auch nicht.
    Es fehlt die Prüfung ob malloc bzw. realloc ühaupt Speicher anlegt(die Schnipsel müsste man halt noch anpassen und einfügen):

    Du weißt nicht, was ein Ansatz ist und wodurch sich dieser von konkreter Implementierung unterscheidet.
    Mein "Ansatz" konkretisiert den von DirkB zuvor genannten realloc-"Ansatz", und wenn du lesen kannst, hast du sicher auch das Wort "Variante" gelesen, was ebenso wie "Ansatz" in der deutschen Sprache eine Sinnverwandtschaft mit "Vorschlag" eingeht und weniger bis gar nichts mit der von dir apostrophierten "ultimativen Gesamtlösung".

    er hat völlig recht. wenn realloc bei einem eventuell zweiten aufruf fehlschlägt sind nicht nur die daten weg, sondern es gibt noch ein schönes loch im ram ( memory leak). wer über andere herzieht, weil sie ein fclose vergessen, sollte dieses wenigstens im kommentar erwähnen. darüber hinaus ist der code schlecht lesbar, und hat viel zu viele unnötige funktions aufrufe. dann frag ich mich, wie soll man ne zweite zeile einlesen können. eine funktion, die eine einzige zeile aus ner datei liest, ganz super 🤡 . im großen und ganzen ist der code also nicht nur suboptimal, sondern eher unter sub-sub optimal. das du das ganze noch in einen gequirlten bockmist worstspielbrei einbettsest ändert auch nix dran.
    👎



  • wo sind sie, die c gurus, die c krieger?
    will den keiner ne vernünftige funktion posten?
    😕


Anmelden zum Antworten