Mit Klassen einen Vektor&Matrix aus Textdatei auslesen
-
This post is deleted!
-
In
Inputdatei
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? Einstd::string
?
Was machst du mitmyfile
? Du rufst nur einclose
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.
-
This post is deleted!
-
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.txt2 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
undmat
für Datentypen?
Warum liest du inchar[]
und nicht instd::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:
-
(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. -
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 derifstream
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)