problem mit fgets()



  • hallo,

    ich möchte gern zeilenweise einen string aus einer textdatei auslesen und nehme dazu fgets():

    //global
    char* str[11];
    
    //lokal
    int i;
    char tmpstr[255];
    FILE  *fd;
    
    fd=fopen("Datei.dat", "r");
    
    for(i=0; i<11; i++)
    {
        fgets(tmpstr, 255, fd);
        str[i]=tmpstr;
    }
    
    fclose(fd);
    

    wenn ich die einzelnen str[i] in der for schleife ausgeben lasse, passt alles. jedoch schon eine ausgabe nach der forschleife (also noch ne for schleife hinten dran mit der ausgabe halt) hat zum ergebnis, dass alle str[i] mit der letzten zeile belegt werden (und selbst dabei ist str[0] nur korrekt, str[1-10] brechen nach 20-30 zeichen (ned gezählt) in kauderwelsch ab).

    in weiteren funktionen des programms verschlimmert sich dies mehr und mehr. so wird am ende aus nem ~200 zeichen strin nen |kM zum bsp.

    ich kann mir das gerade nicht erklären, vllt kennt ja wer von euch das problem. wäre euch zu dank verpflichtet wenn ihr ne lösung wüsstet 🙂



  • Ich verstehe da nur Bahnhof.
    Du liest in Z13 bis zu 254 Zeichen nach tempstr, und kopierst dann nur das erste nach str. Was soll das bringen?



  • Ok, das war Blödsinn. Ich glaub, ich hab's jetzt:

    Du willst dir die Zeilen in str aufheben (hatte die Definition von str überlesen).
    Das geht aber deshalb nicht so wie du das willst, weil in str nur Zeiger sind. Die zeigen nachher alle auf den Anfang von tmpstr, wo aber am Ende eben nur die letzte Zeile drin ist.

    Abhilfe kannst du schaffen, indem du nicht nur Zeiger auf die Zeilen hälst, sondern jede Zeile in Sicherheit kopierst (also wäre str nicht *char[], sondern char[][]). Da wäre dann in Z14 statt der Zeigerkopie ein memcpy(str[i], tmpstr) abgebracht.

    War das das, was du gemeint hast?

    EDIT:
    Eigentlich wäre in diesem Fall tmpstr nutzlos, weil man auch gleich nach nach str[i] einlesen könnte.



  • hmm, ich denk mal das is der fehler. noch eine kleine frage bei str[][]...

    muss dass dann str[255][11] lauten oder andersrum? ich weis grad ned was er da als zeichen nimmt un was als index ^^

    und hmm, wenn ich jetzt 255 zeichen bereit stelle, der string aber nur 200 lang ist, werden dann dennoch 255 zeichen belegt?



  • naja, sagen wir mal so... der speicher ist weg, belegt wird net alles, du kannst dir an sehen, wie viel belegt wird, indem du alle zeichen eines strings durchläufst und schaust, wo '\0' steht, oder einfach per strlen() prüfst, wie lange is des ding eigentlich.
    und an sich sind die zeichen belegt, nur mit was is die fragen (außer du änderst das ab und belegst es mit was anderem, aber dann sind sie auch belegt).
    du braucsht ein
    str[11][255];
    das hintere is quasi die länge der einzelnen elemente und das vordere die anzahl der elemente (außer du schreibst es um, man kanns ja so machen, wie man will), aber wenn du jetzt das ganze ausgeben willst, würde ich es so machen, wie ich hier die deklaration des arrays vorgenommen habe



  • ah ok, ich arbeite nämlich mit strlen, wär also unkuhl gewesen, wenn der plötzlich immer 255 ausgibt ^^ aber gut, dann werd ich das mal so testen. thx für die schnelle hilfe 😃



  • jaaaaa, es funzt ^^ ich dank euch ganz herrzlich *g*


Anmelden zum Antworten