Datei spaltenweise auslesen



  • Hallo, liebe Leute,

    ich bin ein ziemlicher C++-Noob, meine Kenntnisse beruhen größtenteils auf der Lektüre von "Einstieg in C++" von Arnold Willemer. Zwar habe ich schon diverse Kurse mitgemacht, aber die gingen nie wirklich in die Tiefe - mehr in Richtung "man macht das so", ohne das "warum".

    Ich habe diverse "Übungen" durchgeführt und kam bisher mit allen Dingen ganz gut zurecht, jetzt aber stehe ich vor dem Problem, dass ich eine Datei spaltenweise auslesen möchte.

    Die Datei sähe irgendwie so aus:

    A B C
    1 2.34 1.45
    7 2.03 6.2
    ...

    Ich habe verschiedenes ausprobiert, aber nur mit mäßigem Erfolg. Ich kann mittles der getline-Funktion zwar jeweils die einzelnen Zahlen in einen string lesen, aber das hilft mir nicht wirklich weiter. Ich habe auch mit der zweiten Variante der getline-funktion (arrayangabe) es geschafft, dass ich die einzelnen Chars auslesen kann, das Problem nur ist folgendes: Die Leerzeichen werden im Array mitausgelesen, obwohl ich dachte, dass diese "übersprungen" werden. Weiter werden die Zahlen nicht als eine gesehen, sondern jedes Zeichen belegt einen Platz im Array (verständlicherweise).

    Hier mal mein code

    #include <iostream>
    #include <fstream>
    #include <iomanip>
    #include <stdlib.h> 
    #include <string>
    
    using namespace std;
    
    int main()
    {
        char eingabe[256];
        float ausgabe =0;
        float a = 1;
        float b = 1;
    
        fstream datei_aus("schreiben.dat", ios::out);
        ifstream datei_ein;
        datei_ein.open("lesetest.dat", ios::in);
        if (!datei_ein) 
        {
          cout << "Die Eingabedatei kann nicht geoeffnet werden.\n";
          }
    
    do{
          datei_ein.getline(eingabe, sizeof(eingabe));
          cout << eingabe[3] << endl;
        }while(!datei_ein.eof());
    
        datei_ein.close();
        cout << "Zum Beenden"<< endl;
        system("PAUSE");
    
        return 0;
    }
    

    Der Code basiert auf den Infos auf oben genanntem Buch, leider komme ich damit nicht zum Ziel.

    Ich habe probiert einfach wie mit "cin" und "cout" zu arbeiten, also so etwas in der art:

    datei_ein >> variablnenname

    aber das funktioniert auch nicht. Was ich eigentlich brauche ist folgendes:

    Die Zahl der ersten Spalte wird in eine Variable gesteckt, die Zahl der zweiten in die nächste, etc. Dann werden damit Rechnungen durchgeführt und die Werte entsprechend spaltenweise gespeichert (das klappte eigentlich gut). Aber das Einlesen ist für mich ein böhmisches Dorf.

    Ich wäre für jede Hilfe dankbar, vor allem auch für eine Erklärung ggf. warum der Helfer-Code das macht, was er machen soll. Danke scon einmal.

    (In der FAQ konnte ich nichts finden)



  • Ich hab ausnahmsweise mal eine Komplettlösung geschrieben. In einem Kurztest hat sie funktioniert:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <limits>
    
    inline void skipvalues(std::istream& is, int num);
    
    int main()
    {
        int column = 1; //Zweite Spalte auslesen.
        std::string name; //Spaltenüberschrift in der 1. Zeile
        std::vector<double> values; //Werte
        std::ifstream infile("Datei.txt");
        if(!infile.good())
        {
            std::cout << "Fehler beim Öffnen" << std::endl;
            return 1;
        }
        skipvalues(infile, column); //zur Spalte springen
        infile >> name;
        infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //in die nächste Zeile springen
        while(infile.good())
        {
            skipvalues(infile, column); //zur Spalte springen
            double tmp;
            infile >> tmp; //Wert einlesen
            if(!infile.good())
                break;
            values.push_back(tmp);
            infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //in die nächste Zeile springen
        }
        infile.close();
        std::cout << name << std::endl;
        for(size_t i = 0; i < values.size(); ++i)
            std::cout << values.at(i) << "; ";
        std::cin.get();
    }
    
    void skipvalues(std::istream& is, int num)
    {
        for(int i = 0; i < num; ++i)
            is.ignore(std::numeric_limits<std::streamsize>::max(), ' '); // num Leerzeichen-getrennte Werte überspringen
    }
    


  • Sieh Dir das mal an:

    #include <string>
    #include <sstream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        string a("1 2.34 1.45\n");
        string b("7 2.03 6.2\n");
        // schreibe Deine Beispielspalten in eine Textdatei;
        ofstream datei("c:/test.txt");
        datei << a << b;   // die zwei Zeilen, a drei Spalten in Datei schreiben
        datei.close();
        ifstream dat("c:/test.txt"); // öffnet diese Datei zum Lesen 
        string eins, zwei, drei;
        dat >> eins >> zwei >> drei;  // Erste Zeile wird in die drei Strings gelesen.
        // Vorbereitung zum Einlesen in die Variablen
        istringstream istr(eins+" "+zwei+" "+drei);
        int var1;
        float var2, var3;
        // Schreiben in die Variablen
        istr >> var1 >> var2 >> var3;
        // und nun die Spalten der zweiten Zeile
        dat >> eins >> zwei >> drei;
        istringstream istr2(eins+" "+zwei+" "+drei);
        int var11;
        float var22, var33;
        istr2 >> var11 >> var22 >> var33;
        dat.close();
        return 0;
    }
    

    😉



  • Sorry, dass ich so spät erst antworte, aber ich konnte mich bisher noch nicht wieder mit C++ befassen, Real Life is a bitch. 😉

    Ich werde die beiden Versionen einmal durcharbeiten und versuchen zu verstehen. Schon einmal sehr großen Dank dafür! 🙂


Anmelden zum Antworten