fsetpos zeigt keine Wirkung



  • Hallo liebe c/c++ Gemeinde,

    ich habe ein wahrscheinlich sehr simples Problem, da ich was das Programmieren angeht aber noch relativ unerfahren bin, finde ich den Fehler nicht. Es wäre super, wenn mir einer von euch helfen könnte.

    Ich möchte eine Textdatei auslesen. Die Dateiposition bestimmter Schlüsselwörter soll zunächst mit fgetpos(...) gespeichert werden, um zu späteren Zeitpunkt an diese Stelle mittels fsetpos(...) zurückspringen zu können.

    Hier mal die zugehörigen Code-Zeilen:

    FILE *geo;
    char line[MAXZEILE];    
    fpos_t ptr1;
    
    geo = fopen("Rumpfgeometriedatei.geo","r");
    
    if(!geo) printf("Die Rumpfgeometriedatei konnte nicht geoeffnet werden");
    
    else{   while(!feof(geo))
                {
                  fgets(line,MAXZEILE,geo);
    
                  if(!strncmp(line,"[Segment]",6))
                  {
                        if(fgetpos(geo,&ptr1)) printf("Position 1 konnte nicht    
                        gesetzt werden\n");
                        printf("Der Positionszeiger 1 zeigt auf Byte : 
                        %ld\n",&ptr1);
                  }
    
                } // Ende der while Schleifen
    
           if(!fsetpos(geo,&ptr1)) printf("Position 1 konnte nicht 
                                   wiederhergestellt werden\n");
           fgets(line,MAXZEILE,geo);
           printf("%s\n",line);
    
           fclose(geo);
    
        } // Ende else Dateiöffnung
    

    Der Befehl fsetpos und die anschließende Ausgabe zeigen hier keinerlei Wirkung. Ich wäre sehr dankbar, wenn mir jemand helfen könnte.

    Danke, Niki



  • fsetpos:

    If successful, the function returns a zero value.

    "%ld" erwartet keinen Zeiger.



  • Das wird so nichts.
    fpos_t ist nicht für printf definiert, feof nur nach einem Lesevorgang.
    Warum willst du überhaupt am Ende nochmal zurückspringen, das birgt nur Fehlerquellen wie man sieht.



  • Mach aus deinem Codeschnipsel mal ein ausführbares Programm ( #include dazu und mit main ) und schau ob das auch den Fehler macht.
    ⚠ Schreib nicht mehr dazu als unbedingt nötig.



  • Erstmal danke euch für die antworten.

    @cooky451
    Danke, habe ich übersehen und beides korrigiert.

    @Wutz

    feof nur nach einem Lesevorgang

    habe das jetzt mit einer do-while Schleife gelöst, müsste doch dann stimmen oder?

    Warum willst du überhaupt am Ende nochmal zurückspringen, das birgt nur Fehlerquellen wie man sieht

    Ja stimmt. Ich muss aus der vorliegenden Geometriedatei an verschiedenen Stellen Werte auslesen. Meine erste Idee war es, diese Stellen zunächst zu bestimmen und anschließend die gesuchten Zeilen auszulesen. Ich weiß das ist super umständlich. Habe das jetzt auch anders gelöst. Dennoch würde mich interessieren, warum fsetpos() keine Wirkung zeigt. Kann es mir nicht erklären und würde gerne dazulernen.

    @DirkB
    Ok, danke für den Hinweis. Hier mal das notwenidgste als ausführbarer Code.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        FILE *geo;
        char line[160];
        fpos_t ptr;
    
        geo = fopen("Datei.geo","r");
    
        if(!geo) printf("Die Datei konnte nicht geoeffnet werden");
    
         else{  do
                {
                  fgets(line,160,geo);
    
                  if(!strncmp(line,"[Belegung]",6))
                  {
                        fgetpos(geo,&ptr);
                  }
    
                } while(!feof(geo));
    
                fsetpos(geo,&ptr);
    
                printf("%s",line);
    
                fclose(geo);
    
             }
    
        return 0;
    }
    

    Die printf-Anweisung am Schluss gibt mir die letzte Zeile der Datei aus. Demzufolge zeigt das fsetpos auch hier keine Wirkung.

    Ich möchte mich nochmal bei euch allen bedanken. Ich weiß, dass das euch hier wahrscheinlich sehr trivial vorkommen muss. Bin aber sehr dankbar, wenn ich mit eurer Hilfe dazulernen kann.



  • nach dem fsetpos() Aufruf greifst du ja auch nicht auf die Datei zu, also ist es kein Wunder, daß du nochmal den letzten in der Zeile eingelesenen Wert ausgegeben bekommst. Versuch's mal mit einem fgets() in Zeile 28.



  • @CStoll
    Hallo CStoll, danke auch Dir für Deine Beteiligung.

    Ich habe fgetpos() in Zeile 28 gesetzt, allerdings hat auch das nichts bewirkt.
    Ehrlich gesagt verstehe den Sinn davon aber auch nicht.

    Laut meinem Verständnis merke ich mir in Zeile 21 doch mit fgetpos() die Position an der der Begriff [Belegung] steht. Dies wird in ptr gespeichert. Durch den Aufruf von fsetpos() in Zeile 27 müsste ich doch dann wieder an diese Stelle zurückgesetzt werden. Die Datei ist ja noch nicht geschlossen, insofern greife ich ja schon noch auf de Datei zu, oder nicht?



  • Den Lesezeiger setzt du in Zeile 27 auf die gemerkte Position zurück, das ist korrekt. Allerdings liest du anschließend nicht mehr aus der Datei aus, so daß es schwierig werden dürfte, dort einen Unterschied festzustellen.

    (PS: Ich sagte auch nichts von fgetpos(), sondern von fgets())



  • @CStoll

    Ups, da sind mir ja wirklich dämliche Fehler unterlaufen, sowohl beim Lesen Deines Beitrags, als auch beim Code an sich. Wenn nicht neu eingelesen wird, kann natürlich auch nichts neues ausgegeben werden.

    Vielen Dank für Deine Geduld und Deine Hilfe, funktioniert jetzt einwandfrei.

    Gruß, Niki


Anmelden zum Antworten