Zeilen überspringen



  • hast du dein Programm mal ausprobiert? Wenn ich mich nicht irre, bleibt der File-Zeiger dort stehen, wo er beim letzten Durchgang aufgehört hat zu lesen. Wenn du also linear erst Zeile 1-10 einlesen willst, dann bearbeiten,dann Zeile 11-20 usw. dann brauchst du nur den Einleseprozess nochmal zu wiederholen, der Zeiger müsste automatisch in der 11. Zeile anfangen zu lesen, wenn du das File nicht zwischendurch schließt oder mit rewind oder fseek oder so rumspielst.

    VG, larsen



  • ich kenn die genaue Anzahl der Spalten, aber wieviele Zeichen in einer Zeile sind weiß ich nicht.

    du musst nicht die genau anzahl wissen sondern nur ne obere schranke... wenn du garantieren kannst das z.b. keine zeile länger als 1024 zeichen ist kannst du der einfachheit halber z.b.
    char temp [1025] verwenden und da mit fgets immer ne zeile einlesen... und dann in der zeile rumparsen oder was auch immer du damit machen willst... wenn du das nicht garantieren könntest müsstest du immer gucken ob fgets auch bis zum zeilenende eingelesen hat oder ob der speicher dafür nicht gereicht hat...



  • Mein Problem hast du richtig verstanden.
    Wo genau muss ich den Einleseprozess wiederholen? Brauch ich diese While-schleife dann gar nicht?
    Ich bekomme nach jedem Schleifendurchlauf der 10er Blöcke immer dasselbe raus 😞
    Hoffe nur ich bekomm das noch irgendwie hin. So schwer kann es doch nicht sein!



  • Mein Problem hast du richtig verstanden.
    Wo genau muss ich den Einleseprozess wiederholen? Brauch ich diese While-schleife dann gar nicht?
    Ich bekomme nach jedem Schleifendurchlauf der 10er Blöcke immer dasselbe raus
    Hoffe nur ich bekomm das noch irgendwie hin. So schwer kann es doch nicht sein!

    solltest du mich damit meinen... doch ne schleife (obs nun while ist oder was auch immer) wirst du schon brauchen... die frage bei der sache ist was du wirklich machen willst, also wozu überspringst du ein paar zeilen und was willst du machen wenn du an der stelle angekommen bist wo du hin willst... ?meist macht es ja nur sinn ganze zeilen zu bearbeiten aber das hängt insbesondere halt davon ab was konkret man umsetzen möchte... aus performance gründen ist die variante jedes zeichen einzeln auszulesen eh nicht zu empfehlen...



  • Also, mein Problem ist, dass ich ein ziemlich langes Datenfile habe, das ich nicht gesamt einlesen will/kann. Daher möchte ich das file zeilenweise (jeweils 10 Zeilen) in ein Feld einlesen und diese 10 Zeilen bearbeiten, Ergebnisse abspeichern...
    Danach kommen die nächsten 10 Zeilen dran, usw. Nur schaffe ich es nicht auf die nächsten 10 Zeilen zuzugreifen (Ziele 11-20). Kannst du mir helfen?
    Gruß



  • 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