problem mit fscanf



  • Bei mir steht die .exe in Projektverzeichnis/bin/debug.
    Die .c steht im Projektverzeichnis, genau wie die 1.txt.



  • Also das hier wäre mein BuildLog:

    Compiling: C:\Users\Valentin\Desktop\Uni\Prog 2\Übungsblätter\stars_progs\main4.c
    Linking console executable: C:\Users\Valentin\Desktop\Uni\Prog 2\Übungsblätter\stars_progs\main4.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings



  • Hat keiner mehr Ideen?



  • Ich hatte doch oben ein Ergebnis hin kopiert. Ist das wie du es dir wünscht?
    Das solltest du erhalten, wenn du das was wir hier geschrieben haben umsetzt.

    Wenn du dir das anders vorstellst, zeige uns dein Wunschergebnis.



  • Naja, also das, was du geschrieben hattest hätte ich gerne, aber ich bekomme es einfach nicht. Ich habe ja alles versucht, was ihr mir geraten hattet, aber ich habe nie das richtige rausbekommen.
    Ich habe es jetzt mal noch mit lcc versucht, aber das gibt mir gar nichts aus, außer, dass der return -1 war...

    Wenn ich noch was übersehen habe, korrigiert mich, aber ich wüsste es nicht...



  • meischda schrieb:

    Ich habe es jetzt mal noch mit lcc versucht, aber das gibt mir gar nichts aus, außer, dass der return -1 war...

    Dann wurde das exit(-1) ausgeführt. Dein Programm konnte die Datei nicht öffnen.
    Dann musst du zusehen, das deine 1.txt im aktuellen Verzeichnis ist. Was immer das auch bei deiner Konstelation heißt.



  • Stimmt. LCC speichert woanders. Aber auch mit der txt im richtigen Ordner bekomme ich nur die initialisierten Zahlen raus... 😕



  • Dann schreib die 1.txt nochmal neu. Ohne Copy&Paste.



  • Zeige mal deinen aktuellen Quelltext mit den entsprechenden Fehlerabfragen im Quelltext.
    Eigentlich hätte die erste Antwort, wenn du die richtig umgesetzt hättest zur Lösung geführt. Aber ich habe den Verdacht du hast nur immer Teile der Antworten umgesetzt.

    Da du ja siehst, wie wir hier ohne Fehlerkontrolle in deinem Quelltext hier herum raten, sollte dein Quelltext im Fehlerfall einige Meldungen heraus geben, damit diese leichter gefunden werden können. Denn deine Aussagen was der Quelltext macht oder machen soll, waren nicht sehr genau 🙄



  • Also mein Code wäre momentan folgender:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
    FILE *fp;
    struct star
     {
         int x,y,z,mag;
         int draper,hrn;
     };
    struct star a;
    
    float x  = 1.0;
    float y = 2.0;
    float z = 3.0;
    float mag = 4.0;
    int draper = 5;
    int hrn = 6;
    
    fp = fopen("../stars/data/stars.txt", "r");
      if( fp == NULL )
        exit(-1);
    
    fseek(fp, 0, SEEK_END);
    int end = ftell(fp);
    int ende = end/20;
    printf("%d, %d\n", end, ende);
    
    fscanf(fp, " %lf %lf %lf %d %lf %d", &x, &y, &z, &draper, &mag, &hrn);
    if (draper==28)
    {
        printf("True");
    }
    else {printf("False\n");};
    printf("%f, %f, %f, %d, %f, %d\n", x, y, z, draper, mag, hrn);
    
    fclose(fp);
    return 0;
    }
    

    Ich habe noch einen kleinen Extra-Teil drin, der mir die Anzahl der Zeichen und ein zwanzigstel selbiger ausgibt. Das war mal am Anfang Teil eines Ansatzes gewesen. Aber ich bekomme immer die richtige Zeichenzahl ausgegeben, d.h. der Pfad zur Datei stimmt. Ich habe es gerade auch mal wieder mit der Datei, die später rein soll probiert, das funktioniert aber auch nicht...

    Und wie gesagt, im Moment will ich einfach nur den Inhalt der Datei zeilenweise , bzw. ohne Schleife ja nur die erste Zeile, einlesen und mir wieder ausgeben.



  • DirkB schrieb:

    Bei scanf ist %f für float, %lf für double.
    Bei printf ist %f für float und double.

    Was meinst du passiert in Ziele 26:

    fseek(fp, 0, SEEK_END);
    

    Richtig, du springst ans Dateiende.
    Und von dort willst du munter Zeichen lesen. Von da, wo nichts mehr ist, da du bereits am Ende bist. 😮 😕 🙄

    Mach mal in Zeile 31 ein rewind(fp); .

    Hattest du das fseek von Anfang an drin?



  • jaa..... :p
    Jetzt gehts.....
    Und wegen so ner kleinen Sache dafür häng ich dann 3 Tage lang am PC..

    Dankeschön. Du bist mein Held!

    Ich hatte den Teil mit der Zeichenzahl auch schon ein paar mal rausgeschnitten und dann hatte es auch nie funktioniert. Aber da waren dann wohl auch immer noch ein paar Type-clash's drin...



  • DirkB schrieb:

    Bei scanf ist %f für float, %lf für double.
    Bei printf ist %f für float und double.

    bezieht sich auf

    float x  = 1.0;
    float y = 2.0;
    float z = 3.0;
    float mag = 4.0;
    
    fscanf(fp, " %lf %lf %lf %d %lf %d", &x, &y, &z, &draper, &mag, &hrn);
    

    Da gibt der Compiler auch eine Warnung. In diesem Fall sogar 4, dass der Variablentyp von x, y, z und mag nicht zum Formatspecifier passt.

    Wenn es keine Warnung gibt, aktiviere sie. Behandle Warnungen wie Fehler.



  • OK. Warnungen waren aus, aber jetzt sind sie an
    Danke nochmal



  • meischda schrieb:

    Und wegen so ner kleinen Sache dafür häng ich dann 3 Tage lang am PC..

    Selber schuld.
    Hättest du von Anfang an deinen Code gepostet und nicht irgendetwas zusammenkopiertes, hättest du die Lösung schon nach deinem ersten Post bekommen.

    Denn der Code aus deinem ersten Post hat ja soweit funktioniert (bis auf das Formatproblem)



  • Hast du es jetzt so:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
        FILE *fp;
        struct star
        {
            float x,y,z,mag;
            int draper,hrn;
        };
        struct star a;
    
        fp = fopen("1.txt", "r");  // Dateinamen anpassen
        if( fp == NULL )
        {	  
            printf("file - error\n");
            exit(-1);
        }
    
        fseek(fp, 0, SEEK_END);
        int end = ftell(fp);
        int ende = end/20;
        printf("Zeichen: %d, Zeilen: %d\n", end, ende);	// todo: denglish
    
        rewind(fp);
    
        int counter = fscanf(fp, " %f %f %f %d %f %d", &a.x, &a.y, &a.z, &a.draper, &a.mag, &a.hrn);		// lf 2 f
        if (counter==6)
        {
            if (a.draper==28)
            {
                printf("True\n");	// add
            }
            else
                printf("False\n");
            printf("%f, %f, %f, %d, %f, %d\n", a.x, a.y, a.z, a.draper, a.mag, a.hrn);	
        }
        else
            printf("fscanf - error\n");
    
        fclose(fp);
        return 0;
    }
    

    ?
    Die Fehlerbehandlung geht sicher noch besser.
    Versuche mal Fehler zu provozieren. Falscher oder nicht vorhandener Dateinamen oder, wenn Dateiname richtig, falscher Dateiinhalt.


Anmelden zum Antworten