Text auslesen, finde Fehler nicht (gebe Quellcode an)



  • Hallo,

    ich versuche ein Textfile auszulesen, der wie folgt ausschaut:

    SN97do 0.010 33.72 0.39 Gold \
    SN97E 0.013 34.02 0.31 Gold \
    SN97cn 0.017 34.71 0.28 Gold \
    SN92al 0.014 34.12 0.29 Gold \
    SN91ag 0.014 34.13 0.29 Gold \
    SN97Y 0.016 34.53 0.27 Gold \
    SN92bo 0.017 34.70 0.26 Gold \
    SN93ae 0.018 34.29 0.25 Gold \

    Ist nur ein Ausschnitt.

    Mein Code hingegen schaut so aus:
    (Ich kenne mich mit Programmieren leider nur wenig aus).

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int zeilen;
        double name, red, distancemod, error, quality;
        FILE *iof;
        char fname[96];
        sprintf(fname, "/Users/Username/Documents/SNe_gold_sample.dat.txt");
        iof = fopen(fname, "r");
    
        //Öffnen klappt
        if(!iof)
        {
            printf("could not open result_ordner\n");
            exit(1);
        }
    
        //hier werden die Anzahl der Zeilen ausgelesen
        int j, c;
        j=0;
        while(1)
        {
            c = fgetc(iof);
            if (c==EOF) break;
            if (c=='\n') j++;
        }
        //anzahl der ist:
        zeilen = j;
        fclose(iof);
    
        sprintf(fname, "/Users/Username/Documents/SNe_gold_sample.dat.txt");
        iof = fopen(fname, "r");
        for(int i = 0; i < zeilen; i++)
        {
            fscanf(iof, "%lf %lf %lf %lf %lf\n", &name, &red, &distancemod, &error, &quality);
    
            cout << red << endl;
    
        }
        fclose(iof);
    
        return(0);
    }
    

    Ich vermute, dass das Problem entweder das Spaltenweise auslesen ist, oder dass z.B. für die erste Zeile ein double verwende.

    Es wird kein Fehler ausgespuckt, sondern das, was gerade auf dem Speicher drauf ist, wie z.B. 6.7e-320.

    Ich hoffe ihr könnt helfen.

    lg

    Ollowain



  • #include <iostream>
    #include <fstream>
    #include <vector>
    
    // am besten noch mit >> und << operator
    struct Reading
    {
        std::string name;
        std::string quality;
        double red;
        double distancemod;
        double error;
    
        Reading(const std::string& name, 
                double red,
                double distancemod, 
                double error, 
                const std::string& quality)
            :name(names), quality(quality), red(red),
             distancemod(distancemod), error(error);
    };
    
    int main()
    {
        const std::string filename = "data.txt";
        std::ifstream ist(filename);
        if (ist)
        {
            std::cerr << "Unable to open  file " << filename << '\n';
            return 1;
        }
    
        std::string name, quality;
        double red = 0, distancemod = 0, error = 0;
        char delim = ' ';
    
        std::vector<Reading> readings;
        while (ist >> name >> red >> distancemod >> error >> quality >> delim) &&
               delim == '\')
        {
            readings.emplace_back(name, quality, red, distancemod, error);
        }
    
        cout << "Gelese Daten:\n\n";
        for (const auto& r : readins)
        {
            std::Cout << r.name << ' '
                      << r.red << ' ' <<
                      << r.distancemod << ' ';
                      << r.error << ' '
                      << r.quality << " \\\n";
        }
        return 0;
    }
    

    Du kannst den Code gerne anschauen für Anre*g*ungen, oder Stichwörter zum recherchieren. Für copy-pate wirst du wohl die Fehler ausbügeln müssen 🙂

    ^pun intended
    


  • Der Wortwitz war....reden wir nicht darüber.
    Regex ist auch fein für. Aber der TE sollte erstmal überlegen, ob er C oder C++ programmieren möchte. Falls das letztere: std::string und fstrram sind deine freunde.



  • Gibt keinen, ich spreche zZ fast kein Deutsch mehr und hab peinlicherweise gedacht, dass das Wort etwas bedeutet, was es aber garnicht tut, mb 😞


Anmelden zum Antworten