istream und ostream
-
Hallo,
ich möchte aus einer Textdatei eine Matrix einlesen.
Die Textdatei sieht so aus:5
0 60 15 8 54
34 0 78 19 39
99 33 0 42 51
98 15 52 0 81
16 91 51 73 0Die erste Zeile gibt Anzahl Zeilen und Spalten an, der Rest ist die Matrix.
Hier nun der Code:
#include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <vector> using namespace std; typedef vector<vector<int> > matrix; void matrix_einlesen(istream &is, matrix &A){ int i,j,n; is>>n; for(i=0;i<n;++i) for(j=0;j<n;++j) is>>A[i][j]; } void matrix_ausgeben(ostream &os, matrix &A){ int i,j,n; n=A.size(); for(i=0;i<n;++i){ os<<endl; for(j=0;j<n;++j) os<<" "<<A[i][j]; } } int main(){ matrix W; matrix_einlesen(cin,W); matrix_ausgeben(cout,W); system("pause"); return 0; }
So hat unser Lehrer das gemacht. Nun habe ich das zuhause nachprogrammiert, weiß jedoch nicht, wie man nun die Textdatei ins Programm einbindet.
Unser Lehrer hat das irgendwie über die Konsole gemacht, kenn mich jedoch nicht so gut damit aus.
Hoffe auf schnelle Antwort.Mit freundlichem Gruß
23ee
-
Ohne mir jetzt den Code genauer angesehen zu haben: Vmtl. hat er einfach auf der Konsole die Standardeingabe aus einem File geholt:
./deinprogramm < /pfad/zu/deinem/eingabefile.txt
-
Hallo,
danke für die schnell Antwort.Ich habe in der Konsole jetzt
C:\Users\23ee>C:\Users\doducle\Desktop\Studium\Mathe\algo\test_i_ostream.exe < C:\Users\23ee\Desktop\Studium\Mathe\algo\floyd-warshall-input-5.txt
eingegeben.
Wenn ich das so mache, kommt bei mir jedoch ein Fehler und das Programm stürzt ab.
Ich weiß nicht, ob das Programm falsch ist oder ob der Fehler bei der Konsoleneingabe liegt.Mfg
23ee
-
23eee schrieb:
Ich weiß nicht, ob das Programm falsch ist oder ob der Fehler bei der Konsoleneingabe liegt.
Ersteres.
-
Hallo,
wo liegt denn daa dann der Fehler?
Ich hab eigentlich den Code kopiert, den unser Lehrer auch hatte und bei ihm klappte es.Mfg
23ee
-
Mach dich mal mit dem Prozess des Debuggens vertraut.
-
Hallo,
hab gerade den Debugger benutzt.
In der Zeile 15is>>A[i][j];
kommt eine Fehlermeldung:
An Access Violation (Segmentation Fault) raised in your programm.
Bin nicht sicher, was das genau bedeutet, aber kanns sein, dass auf ein Feld zugegriffen wird, das nicht existiert?
Mfg
23ee
-
23eee schrieb:
Bin nicht sicher, was das genau bedeutet, aber kanns sein, dass auf ein Feld zugegriffen wird, das nicht existiert?
Wo stellst du denn sicher, dass die Matrix grosz genug ist?
Wenn du auf einen std::vector via [] zugreifst, gibt es einfach nur einen Segfault, wenn der Vektor nicht so grosz ist wie du glaubst.
-
edit: Falscher Thread, falsches Forum.
-
23eee schrieb:
Bin nicht sicher, was das genau bedeutet, aber kanns sein, dass auf ein Feld zugegriffen wird, das nicht existiert?
Sicher kann das sein, aber die Frage solltest du dir eigentlich selbst beantworten können. 1. Auf welches Feld greifst du zu? 2. Ist der Vektor groß genug, dass dieses Feld existiert? Et voila...
-
Hallo,
danke für die Antworten.
Ich hab den Code jetzt ausgebessert.#include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <vector> using namespace std; typedef vector<vector<int> > matrix; void matrix_einlesen(istream &is, matrix &A){ int i,j,n; is>>n; A.resize(n); for(int k=0;k<n;k++) A[k].resize(n); for(i=0;i<n;++i) for(j=0;j<n;++j) is>>A[i][j]; } void matrix_ausgeben(ostream &os, matrix &A){ int i,j,n; n=A.size(); for(i=0;i<n;++i){ os<<endl; for(j=0;j<n;++j) os<<" "<<A[i][j]; } } int main(){ matrix W; matrix_einlesen(cin,W); matrix_ausgeben(cout,W); system("pause"); return 0; }
Jetzt klappts. Danke
Mfg
23ee