Datei Zeile für Zeile auslesen
-
Hallo ich habe folgende 2 Funktionen das was ich aus der Datei test.txt auslese will ich an die Funktion get übergeben. get soll die Daten nur als const char* empfangen können.
So habe ich das mal versucht umzusetzen. (Es funktioniert auch).
Aber kann man das nicht weniger umständlich lösen?
Erst pack ich die Daten nach ZeilenChar dann nach ZeilenStr und letztendlich nochmal in den String Parameter1.void get ( const char *data1 , const char *data2, const char *data3 ) { cout<<"data1: " << data1 << endl; cout<<"data2: " << data2 << endl; cout<<"data3: " << data3 << endl; } void test() { vector<string>ZeilenAlsStr(10); vector<char>ZeilenChar(10); string Parameter1; ifstream file("test.txt"); int i=0; while ( !file.eof() ) { file.getline( &ZeilenChar[i],10); // 10 Zeichen pro Zeile auslesen ZeilenAlsStr[i] = &ZeilenChar[i]; i++; } Parameter1 = ZeilenAlsStr[0]; cout<<"str: " << Parameter1<<endl; get ( Parameter1.c_str() , "0","0" ); }
-
das sieht sehr nach rumgefrickel aus...
so könntest du es zum Beispiel (besser) machen:
std::vector<std::string> lines; std::ifstream settingsIn(file.c_str()); while (settingsIn.good() && !settingsIn.eof()) { std::string line; std::getline(settingsIn, line); lines.push_back(line); }greetz KN4CK3R
-
KN4CK3R schrieb:
das sieht sehr nach rumgefrickel aus...
so könntest du es zum Beispiel (besser) machen:
std::vector<std::string> lines; std::ifstream settingsIn(file.c_str()); while (settingsIn.good() && !settingsIn.eof()) { std::string line; std::getline(settingsIn, line); lines.push_back(line); }greetz KN4CK3R
Falsch.
string line; while (std::getline(settingsIn, line)) lines.push_back(line);Erst Lesen, dann auf Fehler prüfen, dann verarbeiten. Sonst verarbeitest du bei Fehler (z.B. Dateiende) irgendwelchen Schrott.
-
SeppJ schrieb:
string line; while (std::getline(settingsIn, line)) lines.push_back(line);->
for(std::string line; std::getline(is, line);) lines.push_back(std::move(line));:p
-
Na, dann aber auch:
for(std::string line; std::getline(is, line); lines.push_back(line));~Das std::move lasse ich mal der Übersichtlichkeit halber weg. Es ändert auch nichts großartig an der Semantik (die bei KN4CK3R falsch war) sondern ist eher technischer Natur.~
P.S.: Eigentlich sieht das gar nicht so unelegant aus. Ich glaube, diese Konstruktion werde ich in Zukunft häufiger benutzen, um Leute zu verwirren und die Flexibilitat der for-Schleife zu demonstrieren.

-
Ich finde das push_back im Schleifenkörper schöner.
-
Aber eine for-Schleife mit nur 2 von 3 möglichen Klauseln ist vergebenes Potential!

-
Na gut, überzeugt.
-
Danke für die Hilfe.
Zu cin>> habe ich noch eine Frage:
Wenn ich jetzt hier über cin etwas in cmd einlese und Enter drücke dann Ignoriert mein Programm einfach das getline(cin,z1);

Ich hab jetzt nach dem cin>>cmd; einfach ein cin.syc(); gesetzt dann wird mein getline auch nicht ignoriert. Aber wieso ignoriert der PC das einfach wenn ich kein cin.sync(); benutze?
string cmd; string z1; cout<<"cmd: "; cin>>cmd; cin.sync(); cout<<"z1: " ; getline(cin,z1); cout<<z1<<endl; cout<<cmd<<endl;
-
314159265358979 schrieb:
SeppJ schrieb:
string line; while (std::getline(settingsIn, line)) lines.push_back(line);->
for(std::string line; std::getline(is, line);) lines.push_back(std::move(line));:p
Ist eigentlich garantiert, das man in den String noch schreiben kann, nach einem Move? Weil getline muss ja in den String schreiben ...
-
MrUnwissen schrieb:
Danke für die Hilfe.
Zu cin>> habe ich noch eine Frage:
Wenn ich jetzt hier über cin etwas in cmd einlese und Enter drücke dann Ignoriert mein Programm einfach das getline(cin,z1);

Nix ignorieren. Computer irren sich nicht. Das Ergebnis ist bloß eine leere Eingabe, da der Operator>> bis zum nächsten Whitespace liest (und diesen nicht mitliest), getline hingegen liest bis einschließlich dem nächsten Zeilenumbruch (welcher als Whitespace gilt). Wenn du nun also nach einem Operator>> ein getline benutzt und der Operator>> bei einem Zeilenumbruch mit dem Lesen aufgehört hat, dann liest das getline genau gar nichts ein, da es sofort einen Zeilenumbruch findet.
Ich hab jetzt nach dem cin>>cmd; einfach ein cin.syc(); gesetzt dann wird mein getline auch nicht ignoriert. Aber wieso ignoriert der PC das einfach wenn ich kein cin.sync(); benutze?
Auf deinem System mag sync() so implementiert sein, dass es da irgendwelche Zeichen aus dem Stream löscht. Ist aber nicht portabel, benutz sync daher nicht, um Eingabepuffer zu leeren. Falls du alles bis einschließlich dem nächsten Zeilenumbruch löschen möchtest, dann bastel dir etwas mit ignore.
Diese Frage und Konstrukte wie man es richtig macht, kommt hier ungefähr einmal pro Tag. Gestern gab es mindestens zwei Threads dazu, die du noch leicht finden solltest.