string ohne zeilenumbruch einlesen



  • nabend leute,

    ich versuch mir gerade bisschen c beizubringen. nur stehe ich jetzt, ich denke mal, vor nem recht simplen problem. ich moechte eine zeile aus einer datei auslesen.

    jetzt habe ich in diesem kostenlosen buch von galilieocomputing.de folgendes schoenes script gefunden

    /* read_nline.c */
    #include <stdio.h>
    #include <stdlib.h>
    #define BUF 255
    
    char temp[BUF];
    char puffer[BUF];
    
    /* Auslesen der n-ten Zeile */
    char *getsline_number(int n, FILE *file) {
       int i;
    
       for(i = 0; i < n-1; i++)
          if(fgets(temp, BUF, file) == NULL)
             /* Bis zur n-ten Zeile lesen */
             return NULL; /* Zeile scheint nicht zu existieren. */
       /* Stream ist jetzt in der n-ten Zeile. */
       if(fgets(puffer,BUF,file) == NULL)
          return NULL; /* Zeile scheint nicht zu existieren. */
       return puffer; /* Zeile an Aufrufer zurückgeben */
    }
    
    int main(int argc, char *argv[]) {
       FILE *f;
       unsigned int line;
       char *linenr;
    
       if(argc < 2) {
          fprintf(stderr, "Verwendung : %s datei\n",*argv);
          return EXIT_FAILURE;
       }
       f = fopen(argv[1],"r");
       if(f == NULL) {
          printf("Fehler beim Öffnen");
          return EXIT_FAILURE;
       }
       printf("Welche Zeile wollen Sie lesen : ");
       scanf("%d",&line);
    
       linenr=getsline_number(line, f);
       if(linenr == NULL) {
          fprintf(stderr, "Fehler beim Lesen der"
                          " %d-ten Zeile??\n",line);
          return EXIT_FAILURE;
        }
       printf("Zeile %d : %s\n", line, linenr);
       return EXIT_SUCCESS;
    }
    

    nur hab ich dort das problem, dass er mir den zeilenumbruch mit einliest. laesst sich das irgendwie verhindern?

    vielen dank schonmal

    gruss konrad



  • konrad204 schrieb:

    jetzt habe ich in diesem kostenlosen buch von galilieocomputing.de folgendes schoenes script gefunden

    Das ist ein Widerspruch in sich.



  • das mit dem schoenen script?! nunja kann sein. aber ich bin erstmal ganz froh, dass ich was gefunden hab. fang ja gerade erst damit an. und da dieses script nunmal funktioniert, weurde ich es nur gern daran gezeigt. das passe ich dann sowieso noch alles auf meine beduernisse an.

    waere nett, wenn mir trotzdem jemand weiterhelfen koennte 🙂


  • Mod

    konrad204 schrieb:

    nur hab ich dort das problem, dass er mir den zeilenumbruch mit einliest. laesst sich das irgendwie verhindern?

    Nicht, wenn du fgets benutzen möchtest. Aber eine einfache Gegenmaßnahme ist, das den Zeilenumbruch einfach mit einer 0 zu überschreiben (->Stichwort Nullterminierung). Aber nicht vergessen zu prüfen, ob da auch wirklich ein Zeilenumbruch ist! Das könnte zum Beispiel nicht der Fall sein, wenn die letzte Zeile der Datei gelesen wird oder wenn die Zeile zu lang ist.

    Nathan schrieb:

    konrad204 schrieb:

    jetzt habe ich in diesem kostenlosen buch von galilieocomputing.de folgendes schoenes script gefunden

    Das ist ein Widerspruch in sich.

    Absolut. Der Code ist ziemlicher Schrott. Globale Variablen, blödsinnige Zwischenwerte. Absolut nicht zum Lernen geeignet 👎 . Nach zwei Wochen mit einem vernünftigen Buch schreibst du selber viel besseren Code. Wenn du hingegen hiermit lernst, dann lernst du bloß, wie es falsch geht und gewöhnst es dir nie wieder ab.



  • konrad204 schrieb:

    nur hab ich dort das problem, dass er mir den zeilenumbruch mit einliest. laesst sich das irgendwie verhindern?

    fgets liest den zeilenumbruch mit ein, diese eigenschaft gehört zu dieser funktion, kann man in einer library doku nachlesen.
    du kannst, um den zeilenumbruch loszuwerden, mit strchr nach ihm suchen und, wenn vorhanden, mit einer 0 überschreiben.
    dann issa futchi kato.



  • Du musst ihn nicht suchen, er ist das letzte Zeichen...



  • nicht unbedingt.
    siehe post von seppj.
    also doch suchen.



  • Wenn es wirklich eine Textzeile sein soll und nicht mehr könnte man

    fscanf (datei,"%s",string);
    

    in Erwägung ziehen. Allerdings müsste man dann wissen wie lang so eine
    Zeile maximal sein kann.

    Man könnte sich natürlich die Grösse der kompletten Datei besorgen und ausreichend Speicher allokieren 😉


  • Mod

    Guck nochmal nach, was %s genau macht. Du suchst einen Formatstring, der alles bis zum nächsten Zeilenumbruch liest ( "%[^\n]" ), natürlich noch mit Maximallänge (z.B. "%123[^\n]" ). Was aber im Endeffekt bloß ein umständliches fgets ist.



  • SeppJ schrieb:

    Guck nochmal nach, was %s genau macht. Du suchst einen Formatstring, der alles bis zum nächsten Zeilenumbruch liest ( "%[^\n]" ), natürlich noch mit Maximallänge (z.B. "%123[^\n]" ). Was aber im Endeffekt bloß ein umständliches fgets ist.

    "%[^\n]" und fgets sind nicht das Gleiche, [^\n] liest \n immer nicht ein, fgets liest meistens \n ein.


Anmelden zum Antworten