Mit Klassen einen Vektor&Matrix aus Textdatei auslesen



  • Dieser Beitrag wurde gelöscht!


  • InInputdatei steht wahrscheinlich noch die vorherige Eingabe und die Neue wird angehängt. Mal so als Ahnung.



  • @Symn3169 Es wäre toll, wenn du deinen Code in Code Tags setzen könntest. Das macht den besser lesbar und geht auch noch nachträglich. Einfach Beitrag bearbeiten, Code markieren und auf </> neben dem Drop Down für die Sprachauswahl (C++) drücken.

    Bei dem Code fehlt über die Hälfte. Was ist den Inputdatei für ein Typ? Ein std::string?
    Was machst du mit myfile? Du rufst nur ein close darauf auf, aber du liest nichts damit.

    ich würde vermuten, du meinst sowas (was auch immer x ist):

    std::string Inputdatei;
    std::cout <<"Name der Datei mit dem Vektor" ;
    std::cin >> Inputdatei;
    std::ifstream myfile(Inputdatei)
    x.Vector(myfile)
    myfile.close() ;
    

    Aber, das ist nur geraten, da zu viele Informationen fehlen.



  • Dieser Beitrag wurde gelöscht!


  • Wenn ich das so erweitere, dass das compiliert, funktioniert es bei mir auch:

     #include <iostream>
     #include <fstream>
    #include <vector>
     using namespace std;
     struct Vector
     {
       Vector(char* Datei)
       {
    
         //Dateityp fürs einlesen
         std::ifstream myfile;
    
         //Öfnnen der Inputdatei
         myfile.open(Datei);
    
         //Einlesen der Dimension m
         myfile >> this->size;			//This-> size liest die Dimension aus txt datei und verändert Membervariable
    
         mass.resize(size);
         //x
         for (int i = 0; i < this->size; i++) {
           myfile >> this->mass[i];		//liest den Vektor aus und wird der Membervariable mass zugeschrieben
         }
    
    
         //Inputdatei schließen
         myfile.close();
    
       }
    
       void Print(std::ostream& stream)
       {
         for (int i = 0; i < this->size; i++) {
           stream << this->mass[i];		//liest den Vektor aus und wird der Membervariable mass zugeschrieben
         }
         stream << "\n";
       }
       vector<double> mass;
       size_t size;
     };
    
     //Einlesen einer Matrix aus Inputdatei
     struct Matrix
     {
       Matrix(char* Datei)
       {
         //std::cout << "lul";
         //Dateityp fürs einlesen
         std::ifstream myfile_mat;
    
         //Öfnnen der Inputdatei
         myfile_mat.open(Datei);
    
         //Einlesen der Dimension m
         myfile_mat >> this->height >> this->width;			//This-> size liest die Dimension aus txt datei und verändert Membervariable
    
         mat.resize(height * width);
    
       //Matrix auslesen
         for (int i = 0; i < this->height; i++) {
           for (int j = 0; j < this->width; ++j) {
             myfile_mat >> this->mat[i * this->width + j];		//liest die Matrix aus und wird der Membervariable mat zugeschrieben
           }
         }
    
    
         //Inputdatei schließen
         myfile_mat.close();
    
       }
    
       void Print(std::ostream& stream)
       {
         for (int i = 0; i < this->height; i++) {
           for (int j = 0; j < this->width; ++j) {
             stream << this->mat[i * this->width + j];		//liest die Matrix aus und wird der Membervariable mat zugeschrieben
           }
           stream << "\n";
         }
       }
       std::size_t height, width;
       vector<double> mat;
    
     };
    
     int main() {
    
       //Deklaration
       char InputdateiVektor[20];
       char InputdateiMatrix[50];
    
       //------------------------------------------VEKTOR AUSLESEN-----------------------------------------------
      /**/ //Dateityp fürs einlesen
       std::ifstream myfile_vec;
    
       //Name der Inputdatei über Konsole abfragen
       std::cout << "Geben Sie den Namen der Einlesedatei fuer den Vektor an:" << std::endl;
       std::cin >> InputdateiVektor;
       //std::cout << InputdateiVektor << std::endl;
    
       //Aufruf des Objekts zum Auslesen
       Vector x(InputdateiVektor);
    
    
       //Ausgeben des eingelesenen Vektors
       std::cout << "Vektor x =" << std::endl;
       x.Print(std::cout);
       //myfile_vec.close();    
    
       //-------------------------------------------MATRIX AUSLESEN--------------------------------------------
       //Dateityp fürs einlesen
       std::ifstream myfile_mat;
    
       //Name der Inputdatei über Konsole abfragen
       std::cout << "Geben Sie den Namen der Einlesedatei fuer die Matrix an:" << std::endl;
       std::cin >> InputdateiMatrix;
       //Aufruf Objekt zum Auslesen
       Matrix A(InputdateiMatrix);            //*es geht nicht in mein Objekt hab es mit Debugger getestet*
    
    
       //Ausgeben des eingelesenen Vektors
    
       A.Print(std::cout);
       //myfile_mat.close();
     }
    
    

    mit 2 Dateien getestet
    vec.txt

    2
    1
    2
    

    mat.txt

    2
    2
    1
    2
    3
    4
    

    Möglicherweise hast du noch was im Eingestream stehen? Du kannst versuchen den Eingabestream nach der ersten Eingabe zu leeren:

       cin.clear(); //setzt den error state zurück (auf goodbit)
       cin.ignore(numeric_limits<streamsize>::max(), '\n'); //ignoriert alles mit zum Zeilenumbruch, falls noch was im Stream steht
    

    Wie hältst du denn die Daten in den Klassen? also, was sind mass und mat für Datentypen?
    Warum liest du in char[] und nicht in std::string?



  • @Symn3169 sagte in Mit Klassen einen Vektor&Matrix aus Textdatei auslesen:

    	//Dateityp fürs einlesen
        std::ifstream myfile;
    
        //Öfnnen der Inputdatei
        myfile.open(Datei);
    
        //Einlesen der Dimension m
        myfile >> this->size;			//This-> size liest die Dimension aus txt datei und verändert Membervariable
    
    	//x
        for (int i=0;i<this->size;i++){
            myfile >> this->mass[i];		//liest den Vektor aus und wird der Membervariable mass zugeschrieben
        }
    	
    	
        //Inputdatei schließen
        myfile.close();
    
    }
    

    Ich habe 2 Kommentare hierzu:

    1. (wichtig): Du liest mit myfile >> this->size; die Member-Variable size ein. Aber wer sorgt dafür, dass auch genügend viel Speicher für die einzelnen Werte vorhanden ist? Oder hast du ein fixed-size Array darunterliegen? Was ist, wenn hier völlig falsche Werte in der Datei stehen? Du musst erstens überprüfen, ob das Lesen erfolgreich war - und dann musst du noch sicherstellen, dass der Wert auch noch klein genug ist bzw dass in der Schleife, die danach kommt, auch so viele Werte wie angegeben verfügbar sind. Du musst also auch da prüfen, ob das Einlesen der Werte erfolgreich war. Aber ich denke, die Frage danach, wo hier die Daten eigentlich gespeichert werden, ist wohl die wichtigste.

    2. Du brauchst beim ifstream nicht die drei Operationen Konstruktor, open und close separat. Dem Konstruktor kannst du bereits den Dateinamen übergeben und das close passiert automatisch, wenn der ifstream out-of-scope geht, also bei der }. Stattdessen wäre wichtiger zu testen, ob die Datei auch offen ist bzw. ob das Einlesen funktioniert.

    ...
    ifstream myfile(Datei);
    if (!myfile.is_open()) {
       cout << "Konnte Datei " << Datei << " nicht öffnen.\n";
       // z.B. ne Exception raisen
    }
    ...
    

    Man könnte auch fragen, ob das Einlesen einer Datei unbedingt im Konstruktor passieren muss - du willst vielleicht auch mal mehrere Formate unterstützen etc. und die Hauptaufgabe der Matrix- und Vectorklasse sollten ja Matrix- und Vectoroperationen sein und nicht io. Ich würde daher eher Konstruktoren mit der Dimension als Parameter erwarten.



  • @Schlangenmensch alles klar ich habe es hinbekommen vielen Dank. Das mass und mat sind double*. Das wurde uns alles so von der Uni so vorgegeben auch das mit char[] statt std::string.



  • @wob Vielen Dank hat geklappt. In der Aufgabe die ich bekommen habe muss das Einlesen als Konstruktor definiert werden.



  • @Symn3169 sagte in Mit Klassen einen Vektor&Matrix aus Textdatei auslesen:

    Das mass und mat sind double*. Das wurde uns alles so von der Uni so vorgegeben auch das mit char[] statt std::string.

    Diese Vorgaben sind kritisch zu hinterfragen! (brauchst du für deinen Uni-Kurs wohl nicht zu machen, aber solltest du tun, wenn du C++ richtig lernen willst)


Anmelden zum Antworten