Datei lesen
-
Guten Abend zusammen
ich bin C++ Anfänger und bräuchte dringend eure Hilfe.
ich habe versucht die Textdatei
42 29 71 9
39 64 25 2
39 71 32 1
35 68 33 5
35 71 36 11
mit dem folgenden Quellcode(aus dem Forum kopiert) mit VC++ zu lesen und auszugeben, er meldet zwar keine Fehler aber ich sehe nichts in der Konsole!!! noch dazu habe ich nicht verstanden was die for-schleifen tun. (Kommischer Aufbau for(..;is;..) . Ich bedanke mich für Hilfe und jeden tip im Voraus#include <vector>
#include <fstream>
#include <iostream>using namespace std;
int main()
{std::vector<std::vector<int> > matrix;
size_t vectorSize;
std::ifstream is("c:\tt.txt");for(size_t vectorNum = 0; is; ++vectorNum)
{//reserve memory for vector in matrix
matrix.resize(vectorNum + 1);//reserver memory for inner vector
matrix[vectorNum].resize(4); // 4 Steht für die Anzahl der Elemente pro Zeile//read inner vector
for(size_t i = 0; i < vectorSize; ++i && is)
{
is >> matrix[vectorNum][i];
cout << matrix[vectorNum][i];
}
}// Jetzt stehen die Werte in "matrix[Zeile][Spalte]"
return 0;
}
-
#include <vector> #include <fstream> #include <iostream> using namespace std; int main() { std::vector<std::vector<int> > matrix; size_t vectorSize; std::ifstream is("c:\tt.txt"); // ich schätze mal hier fehlt ein Backslash ;-) for(size_t vectorNum = 0; is; ++vectorNum) { // reserve memory for vector in matrix matrix.resize(vectorNum + 1); // reserver memory for inner vector matrix[vectorNum].resize(4); // 4 Steht für die Anzahl der Elemente pro Zeile // read inner vector for(size_t i = 0; i < vectorSize; ++i && is) { is >> matrix[vectorNum][i]; cout << matrix[vectorNum][i]; } } // Jetzt stehen die Werte in "matrix[Zeile][Spalte]" return 0; }
Versuche mal die Zeile:
std::ifstream is("c:\tt.txt");
durch
std::ifstream is("c:\\tt.txt");
zu ersetzen.
das "is" ist dein Input-Stream. Wenn das öffnen nicht geklappt hat, ist der gleich Null (== false) und die for()-Schleife wird nie durchlaufen.
Grüße
Ayman, der hier mal frei tipptEdit: Der Backslash '\' dient in C/C++ als Escape-Zeichen. Mit ihm kann man Zeichenkonstanten angeben, die sonst nicht sichtbar wären, etwa den Zeilenrücklauf (Carriage Return) '\r' oder den Zeilenvorschub (Newline) '\n'. Will man den Backslash selbst in einem String-Literal angeben, muss man immer '\' schreiben, ihn also doppelt aufführen.
-
Vielen Dank Ayman
das stimmt mit \\ aber ich bekomme troztdem eine Konsole voll von Zahlen und Nullen wie in matrix reloadedund dann hängt es und folgt eine windows Fehlermeldung.
for(... ; ..; ++i && is) die Zweite Schleife kapiere ich auch nicht.
bitte Hilfe
Danke
-
CU3000 schrieb:
...und dann hängt es und folgt eine windows Fehlermeldung...
und welche? sind wir hellseher?
-
for(size_t i = 0; i < vectorSize; ++i && is) { is >> matrix[vectorNum][i]; cout << matrix[vectorNum][i]; }
Das "is" steht wohl an der verkehrten Stelle. Es soll verhindern, dass die innere Schleife über das Ende der Datei hinausliest. Tut es da aber nicht. Ich habe es geändert - siehe unten.
Mir fällt auf, dass vectorSize nicht initialisiert wird, also ist es undefiniert - in der Regel irre hoch. Darum kommt auch der lange Datensalat auf der Konsole heraus. Sollte aber wohl = 4 sein, also setzten wir es entsprechend.
#include <vector> #include <fstream> #include <iostream> using namespace std; int main() { std::vector<std::vector<int> > matrix; size_t vectorSize = 4; std::ifstream is("c:\\tt.txt"); for(size_t vectorNum = 0; is; ++vectorNum) { // reserve memory for vector in matrix matrix.resize(vectorNum + 1); // reserver memory for inner vector matrix[vectorNum].resize(vectorSize); // vectorSize ist die Anzahl der Elemente pro Zeile // read inner vector for(size_t i = 0; (i < vectorSize) && is; ++i) { is >> matrix[vectorNum][i]; cout << matrix[vectorNum][i] << ' '; } cout << "\r\n"; // Zeilenumbruch } // Jetzt stehen die Werte in "matrix[Zeile][Spalte]" return 0; }
Es läuft. Hab's getestet.
Grüße
Ayman
-
Hi
oh Ayman vielen vielen Dank es funzt wunderbar!
ich wollte trotzdem den anderen Mitstreiter die fehlermeldung, die in der Vorversionbekommen habe, noch mitteilen.Ich habe in der for schleife (in der Vorversion) was eingefügt:
for(size_t vectorNum = 0; is;++vectorNum )
{
is >> vectorSize; //vector-Größe einlesen
if(!is)
break;
....
....
}dann kommt trotzdem die Fehlermeldung:
Debug Error!
Programm: ...Einstellungen\User\Desktop\...\Debug\prog.exeDAMAGE: after normal block (#154) at 0x008F23300
Press retry to debug the application