streams - wie kann ich ganze Sätze in Dateien schreiben?
-
Hallo zusammen!
Ich hab eine Frage zum Programmieren mit Dateien, dazu folgendes \1:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ofstream dat_ausgabe; string dateiname = "dateitext.text"; string text; dat_ausgabe.open(dateiname.c_str(), ios_base::out); cout << "Bitte geben Sie den Text ein!" << endl; cout << endl; cin >> text; dat_ausgabe << text << endl; if(!dat_ausgabe) { cout << "Die Datei konnte nicht geoeffnet werden!" << endl; return -1; } dat_ausgabe.close(); return 0; }
ich möchte also, dass der Text, den der Anwender eingibt in der Datei gespeichert wird. Lautet der Text jedoch zB
"Hallo wie gehts es Dir?"
wird nur das erste Wort ("Hallo") in der Datei gespeichert, was vermutlich an dem darauffolgenden Lehrzeichen liegt. Wie muss ich das ganze angehen, wenn ich möchte, dass ganze Sätze gespeichert werden? Ist das so überhaupt möglich?
Danke!
-
das liegt am operator>>.
verwende getline:getline(cin,dein_string);
außerdem noch ein bisschen kritik zum stil:
variablen so spät wie möglich instanziieren: das betrifft vor allem dein ofstream objekt.
der aufruf von close() ist reine tippverschwendung, der destruktor macht das automatisch.
ios::out musst du nicht explizit angeben.
das mit operator! auf filestreams: er liefert true, wenn das fail oder das badbit gesetzt ist. nachdem du in deine datei geschrieben hast zu fragen, ob sie auch offen ist, ist etwas unsinnig.
lieber so:#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string dateiname = "dateitext.text"; ofstream dat_ausgabe(dateiname.c_str()); if(!dat_ausgabe()) { //oder genauer: if (!dat_ausabge().is_open()) cerr << "Fehler!\n"; exit(-1); } cout << "Bitte geben Sie den Text ein!\n\n"; //endl ist überflüssig string text; cin >> text; dat_ausgabe << text << '\n'; //return 0 wird automatisch eingefügt in main }
-
cin >> text; liest nur ein Wort ein.
Mit getline(cin, text); wird die ganze Zeile eingelesen.
-
Es ist kein guter Programmierstil, alles automatisch machen
zu lassen.Z.B. close() Aufruf: wenn du dass nicht explicit dahinschreibst,
wirst du vermutlich irgendwann den Aufruf ganz vergessen, obwohl es an der
Stelle vielleicht auf jeden Fall dahinmuss. Und dann suchst du dich tot...EDIT: Zitat gelöscht
-
Äh, bitte was?
Und wenn irgendwo ne Exception fliegt, soll er die wahrscheinlich erst noch fangen, damit er .close() aufrufen kann, damit es auch ja nicht autmatisch gemacht wird?
-
proga schrieb:
Es ist kein guter Programmierstil, alles automatisch machen
zu lassen.Doch ist es. Das ist der Sinn von Destruktoren.
-
Danke für eure Hilfe, beschäftige mich noch nicht lage mit C++ und kannte daher getline() noch nicht.
außerdem noch ein bisschen kritik zum stil:
variablen so spät wie möglich instanziieren: das betrifft vor allem dein ofstream objekt.Jap ,mein Stil hapert vermutlich noch ein bisschen... Aber:
Warum denn Variablen so spät wie möglich instanziieren? Welche Vorteile bietet das? Ich schreib immer alle Variablen an den Anfang der Funktion, weil es mir übersichtlicher erscheint... Kann das denn Auswirkungen auf das Programm haben?
-
Wenn ein Objekt insanziert wird, wird auch sein Konstruktor aufgerufen, wird es zerstört, sein Destruktor. Wird deine Funktion/Methode nun vorher beendet, z.b. durch eine Exception, würden Konstruktor und Destruktor unnötig aufgerufen.
Außerdem sollten Variablen so lokal wie möglich sein, denn desto weniger Fehler kann man mit ihr machen.
-
-
okay, das klingt überzeugend.
ich denk mal wenn ich mich irgendwann mit C++ n bisschen besser auskenne werde ich auch merken, dass es so mehr Sinn macht. Danke!