Datei einlesen - Original-Quellcode, funzt nicht
-
Hallo ihr Lieben,
gerade schaute ich mir auf Youtube ein Video von Jörn Loviscach an.Dort habe ich nahezu 1:1 den Quellcode nachgebastelt. Aber bei mir kommt nicht das raus, was rauskommen sollte.
Es geht um das Einlesen einer Textdatei, Zeile für Zeile. In die Textdatei habe ich Folgendes geschrieben:
zeile1,123456,12.345,1786
zeile2,123456,12.345,2786
zeile3,123456,12.345,3786
zeile4,123456,12.345,4786
zeile5,123456,12.345,5786
zeile6,123456,12.345,6786Nun geht es darum, dass die Kommatas durch Leerzeichen ersetzt werden sollen. Wenn ich das PRogramm einmal durchlaufen alsse, ersetzt es mir aber nicht gewünscht die Kommatas durch Leerzeichen. und auch der Rest des QUellcodes scheint ins Leere zu laufen. Was mache ich falsch?
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;int main()
{
ifstream datei("test.txt");string zeile; while(getline(datei, zeile)) { for(int i=0; i<zeile.size(); i++) { if(zeile[i] == ',') zeile[i] = ' '; } stringstream zeilenpuffer(zeile); string a; int b; double c; int d; zeilenpuffer >> a >> b >> c >> d; cout << "a: " << a << "\t b: " << b << "\t c: " << c << "\t d: " << d << endl;
}
return 0;
}Das Video von Loviscach ist https://www.youtube.com/watch?v=rnGoCWNtNR0
Vielen Dank für jeden Hinweis...
Liebe Grüße
Hawaiihemd
-
#include <fstream> #include <iostream> #include <sstream> #include <string> using namespace std; int main() { ifstream datei("test.txt"); string zeile; while (getline(datei, zeile)) { for (unsigned int i = 0; i < zeile.size(); ++i) { if (zeile[i] == ',') { zeile[i] = ' '; } } stringstream zeilenpuffer(zeile); string a; int b; double c; int d; zeilenpuffer >> a >> b >> c >> d; cout << "a: " << a << "\t b: " << b << "\t c: " << c << "\t d: " << d << endl; } return 0; }
a: zeile1 b: 123456 c: 12.345 d: 1786 a: zeile2 b: 123456 c: 12.345 d: 2786 a: zeile3 b: 123456 c: 12.345 d: 3786 a: zeile4 b: 123456 c: 12.345 d: 4786 a: zeile5 b: 123456 c: 12.345 d: 5786 a: zeile6 b: 123456 c: 12.345 d: 6786
Bei mir läuft das.
Kann das sein, dass Du irgendwelche Dateizugriffsberechtigungen nicht hast?
-
Hm, einerseits beruhigt es mich, dass es tatsächlich funzt, andererseits beunruhigt es mich, dass es eben bei mir nicht läuft. Der Laptop gehört voll und ganz mir, dahe rsind mir keine Einschränkungen bekannt. Sehr mysteriös ...
Ich werde das morgen mal auf einem anderen Rechner probieren. Danke Dir!
-
Bitte probier mal das
ifstream datei("test.txt"); assert(datei.fail() == false);
oder das
ifstream datei("test.txt"); assert(!datei == false);
Und inkludiere bitte mal
#include <cassert>
.bool operator!() const;
(Mitgliedsfunktion) macht das gleiche wiebool fail() const;
.
Sie liefernfalse
, wenn etwas schiefgelaufen ist.
-
@dozgon sagte in Datei einlesen - Original-Quellcode, funzt nicht:
#include <cassert>
Dann ist die Fehlermeldug die Folgende:
Assertion failed: datei.fail() == false, file C:\Users\mail\OneDrive\Dokumente\Cpp\Loeviscoach\Datei_lesen.cpp, line 15
In zeile 15 steht bei mir
assert(datei.fail() == false);
-
Die Datei "test.txt" muss, wenn du sie ohne Pfadangabe öffnest, im aktuellen Arbeitsverzeichnis liegen. Wenn du z.B. das Programm aus Visual Studio startest, dann ist das typischerweise das Verzeichnis wo auch die
.vcxproj
Datei liegt.
-
Also gibt es offenbar ein Problem beim Einlesen der Datei.
Ich habe noch vergessen, meine Referenzen hinzuzufügen:
https://cplusplus.com/reference/ios/ios/operator_not/
Also, wenn Du magst, kannst Du Dir merken, dass man Operatoren wie
!
und+
bzw.operator!()
undoperator+()
überladen kann in C++.
Das sind einfach nur Mitglieds-Funktionen (in einer Klasse) oder halt freie Funktionen (nicht in einer Klasse deklariert), die halt spezielle "Namen" bzw. Zeichen haben (+
,!
).Mit
assert
machst Du "Zusicherungen".
Du sicherst Dir Sachen zu wie das:assert(2 + 2 == 4);
Oder, sinnvoller, wie das:
assert(sizeof(int) == 4U);
-
Hm, meine test.txt-Datei war durchaus im entsprechenden Ordner. Davor habe ich es auf dem Desktop gehabt und auch tatsächlich die ADresse vom Desktop so angegeben, wie es Loviscach in seinem Video gemacht hat. Beides hilft nicht...
-
@Hawaiihemd, entschuldige, ich glaube mein Beitrag, war wohl unnötig (das mit der Überladung und dem
assert
).Das verwirrt glaube ich eher als dass es hilft.
Also bitte ignorieren, falls es Dich verwirrt.
Zum Problem:
Weißt Du, wo die
.exe
liegt?
Also die ausführbare Datei?
Kannst, wenn Du magst, probieren, ob das funktioniert, wenn Du Deine.exe
und die Datei im gleichen Ordner hast.
Dann kannst Du ja, wenn Du magst, einfach mal den Pfad auf "test.txt" setzen.
-
Die Exe-Datei liegt auch im selben Ordner. Aber wenn ich die öffne, passiert da sgleiche. Also jetzt auch wieder die Fehlermeldung. Aber in der txt-Datei ändert sich nichts.
Und als Pfad habe ich ja im QUelltext test.txt stehen...
-
@Hawaiihemd Das ist echt komisch.
Also die Datei kann nicht geöffnet werden, dass haben wir durch das
assert
(Nachprüfung oder Zusicherung) herausgefunden.
-
Ich probiere das wirklich mal von einem anderen Rechner. Dann stimmt einfahc mit meionem laptop irgendwas nicht. Andere Beispiele aus anderen Videos und aus Büchern funktionieren. Dann hänge ich mich da jetzt mal nicht auf...
Vielen Dank für die Hilfen!!!
-
Kannst du deine Datei mit einem Texteditor öffnen? Wie führst du die exe aus?
Öffne mal die Konsole, navigier in den Ordner in dem die Exe liegt und starte die Exe von da aus.
-
@dozgon sagte in Datei einlesen - Original-Quellcode, funzt nicht:
Also die Datei kann nicht geöffnet werden, dass haben wir durch das assert (Nachprüfung oder Zusicherung) herausgefunden.
Ganz abgesehen davon, dass man eine Dateioperation wie das Öffnen einer Datei überprüfen muss, halte ich
assert
dafür für falsch. Mit Assertions sichert man Dinge ab, die immer funktionieren müssen - und weil sie IMMER funktionieren müssen, braucht man diese Dinge nur im Debugging zu testen. Dateioperationen dürfen aber fehlschlagen. Daher sind Assertions hier fehl am Platze.
-
Du magst ja recht haben, ich finde es dennoch nicht verkehrt, mit
assert
zu arbeiten.
Zumal man ja auch die Zusicherungen mit#define NDEBUG
abstellen kann.Man kann natürlich auch bedingte Anweisungen (
if
) bzw. Verzweigungen (if
undelse
) verwenden.
Ist halt mehr Schreibaufwand und eigentlich auch korrekter.Ich möchte dieses Thema aber nicht weiter entgleisen.