Zeilen überspringen



  • char c[3000];

    Hab das ganze mal mit fgets versucht. Schaffe es aber nicht, dass beim zweiten und allen weiteren Schleifendurchläufen (k=1,2...) die richtigen Werte eingelesen werden. Bekomme bei jedem Durchlauf die ersten 10 Zeilen eingelesen. Was mache ich falsch???

    for (k=0; k<30; k++) // Datenfile in 10er-Blöcken bearbeiten
    {
    for (i=0; i<(k*10); i++)
    {
    fgets(c,3000,datei_ptr);
    i++;
    }

    //Einlesen der Matrixelemente
    for (i=(k*10); i< (k*10+10); i++)
    {
    for (j=0; j< MAX_SPALTEN; j++)
    {
    fscanf (datei_ptr,"%lf",&A[i][j]);
    }

    }



  • @Biene: Hör auf Windalf, der scheint sich auszukennen 😃 Also mach ein Feld, das so groß ist wie die maximale Anzahl an Zeichen + 1 (wegen dem Stringende, wie Windalf geschrieben hat, ist furchtbar wichtig, weiß ich aus bitterer Erfahrung 😉 ) und lies dann mit fgets eine Zeile ein, mit der Du was auch immer machst. Dann allerdings habe ich recht, wenn du das 2.Mal mit fgets eine Zeile einliest, kriegst du automatisch die 2. Zeile.

    Brauchst du unbedingt 10 Zeilen auf einmal? Ist doch meist einfacher, wenn man jede Zeile einzeln bearbeitet.

    VG



  • du hast zur selben Zeit geschrieben wie ich. Genau wie vorhin. Irgendwie hänge ich immer hinterher... 😕 😕 😕



  • Ich brauch jeweils 10 Zeilen für meine Berechnung.
    Aber was hab ich in meinem Code jetzt falsch gemacht? Die Zeilen die ich mit fgets einlese brauche ich ja nicht mehr, diese sind ja bereits verarbeitet und die nächsten 10 sind an der Reihe.
    Versteht ihr was ich meine?



  • also ehrlich gesagt wundert mich, dass du beim ersten Schleifendurchlauf überhaupt was kriegst, denn k=0 und k*10=0 und i=0 und i<0 ???
    Eigentlich müsste das funktionieren mit fgets, vielleicht fängst du mal klein an und schreibst mal ein programm, das in etwa so aussieht:

    char c[3000]
    int count;

    while ( fgets(c,3000 ,datei_ptr ) != NULL)
    {
    count++;
    printf (Zeile %i sieht so aus: %s\n", count, c);
    }

    fclose(datei_ptr);

    Damit kannst du sehen, dass du doch jede Zeile einfach so auslesen kannst. Den Test auf NULL brauchst Du, denn am Dateiende liefert fgets NULL zurück. Dann weiß dein Programm, dass die letzte Zeile erreicht ist.



  • Ich glaube ich weiß! Du liest 10mal c ein. Dann enthält doch c aber immer nur die letzte eingelesene Zeile, und nicht alle 10. Du müsstest also jede Zeile irgendwohin speichern, bevor du das nächste Mal c einliest. Verstanden, was ich meine?



  • Das bringt mich ja auch nicht wirklich weiter. Dass die Zeilen eingelesen werden weiss ich ja, aber ich will die nachfolgenden 10 Zeilen (nach fgets) in einer Matrix haben und dann wieder die 10 Zeilen danach und dann ...
    Hab aber irgendwo nen Denkfehler drin.



  • "Ich glaube ich weiß! Du liest 10mal c ein. Dann enthält doch c aber immer nur die letzte eingelesene Zeile, und nicht alle 10. Du müsstest also jede Zeile irgendwohin speichern, bevor du das nächste Mal c einliest. Verstanden, was ich meine? "

    Klingt gut. Werd ich mal nachschauen. DANKE!



  • Bekomm das nicht so ganz hin. Wo speichere ich die Zeile hin, damit ich die nächst einlesen kann?



  • Ich brauch jeweils 10 Zeilen für meine Berechnung.

    also heisst das das immer 10 zeilen zusammen gehören? willst du das überlappend machen oder liest du wirklich 10 zeilen ein... machst dann damit irgendwas (was auch immer) und dann ab damit über den jordan und die nächsten 10 zeilen?...

    in dem fall kannst du das in etwa in der art machen...

    char temp[10][1024] //array für 10 strings mit maximaler länge von jeweils 1023 (ein byte fürs nullbyte...)
    wenn das array zu gross für den stack werden sollte (weil deine zeilenlänge exorbitante grössen annimmt) kannst du es ja auch mit malloc allokieren

    ohne fehler abfangen usw und ungetestet so...

    //10 zeilen einlesen...
    while(!feof(fp){
       for(i=0;i<10;++i)
          fgets(temp[i],1024,fp);
    
    //was auch immer mit den 10 zeilen machen willst.. wenn du wissen willst wieviele zeichen jeweils eingelesen wurden kannst du dir den rückgabewert von fgets merken sonst musst du am ende nochmal ein strlen rüberjagen...
    }
    

    ist so ein typisches problem das sich mit c++ wesentlich komfortabler lösen lässt...



  • Hallo!

    Danke für deinen Tipp! Habe das mal versucht. Wollte die Zeile einlesen, dann abspeichern. wenn ich dann 10 Zeilen abgespeichert habe in datei_ptr4 möchte ich diese in eine Matrix einlesen. Habe das ganze wie folgt versucht, muss aber irgendwie anderst gehen. Es werden nicht die richtigen Werte eingelesen.
    Kannst du vielleicht noch mal über den code schauen und mir weiter helfen?

    Gruß

    char c[3000];

    while (!feof(datei_ptr))
    {
    for(i=0; i<10; i++)
    {
    fgets(c,3000,datei_ptr);
    fprintf (datei_ptr4,"%s\n",c);
    }

    //Einlesen der Matrixelemente
    for (i=0; i< 10; i++)
    {
    for (j=0; j< MAX_SPALTEN; j++)
    {
    fscanf (datei_ptr4,"%lf",&A[i][j]);
    }

    }
    }



  • Guten Morgen,

    in deiner Datei_ptr4 stehen aber die richtigen Werte, d.h. das Einlesen hat geklappt? Bist du dir auch sicher bezüglich des %lf? Wie hast du Feld A initialisiert? Wenn das nicht zusammenpasst können die komischsten Sachen rauskommen...



  • HALLO!!

    Vielen Dank für eure Hilfe! Es hat jetzt geklappt. 🙂 🙂 🙂



  • @ Biene:
    Kannste mal bitte den ganzen Quellcode posten ? Würde mich mal interessieren, wie alles zusammen aussieht ! 👍


Anmelden zum Antworten