Text in Datei Speichern

Cheris

Erfahrenes Mitglied
Hallo,, hab heute folgendes Problem, an dem ich nun schon ewig sitze und nicht weiter komme.

Mein Problem ist folgendes, ich will einen Text in einer Datei schreiben und speichern. Nun speichert es aber immer nur das erste Wort, alle weitere Wörter die folgend werden nicht abgespeichert.

Naja hier erstmal der QuellCode:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main ()

{
ofstream dat_aus;
string dateiname;

cout <<" Geben Sie den Namen der Datei ein: ";
cin >> dateiname;
cout<< endl;
dat_aus.open(dateiname.c_str(), ios_base::out);

if(!dat_aus)
{
cout << " Datei konnte nicht geoeffnet werden";
cout <<endl;
return -1;
}

string text1;

cout <<" Gib deinen Text ein der gespeichert werden soll: ";
cin >> text1;

dat_aus << text1 <<endl;

dat_aus.close();

return 0;
}

Ich hab schon den Tipp bekommen das ich es mit cin.getline machen soll, da der Befehl für mich aber neu ist weiss ich nicht wie ich ihn einbauen soll.

Deshalb habe ich folgende Zeile geändert:


cout <<" Gib deinen Text ein der gespeichert werden soll: ";
cin.getline(text1);

Nun erstellt er zwar immer noch die Datei, schreibt aber gar nichts mehr rein.

Könnt ihr mir da vielleicht helfen? Wäre nett...
 
ja danke, schlau gemacht hab ich mich da auch schon ein bisschen, und die Seite bestätigt mich eigentlich auch.

Es müsste mit cin.getline gehen, so habe ich meinen Code umgeändert:
Code:
getline(cin,text1, ' ');

In einem Code, bei dem ich den Namen abfrage, funktioniert das ganze, wenn ich aber einen Text in der Datei speichern will, wird immer nur ein wort gespeichert.

Kann mir da vielleicht jemand direkt helfen, am besten mit funktionierenten Code..

So langsam komm ich mir da echt nur noch dumm vor...
 
Hi.

Also erstmal darfst du natürlich nicht vergessen, das du für den Buffer "text1" auch Speicher anlegen mußt! Dann solltest du auch darauf achten, das nicht mehr Zeichen eingelesen werden als Zeichen in dem Buffer Platz haben. Das machst du am besten so:
Code:
const unsigned int max = 100;
char buffer[max];
cin.getline(buffer, max);

Der Fehler den du gemacht hast ist weiter, das du als Trennzeichen das Leerzeichen angegeben hast. Dann liest er natürlich auch wieder nur bis zum ersten Trennzeichen (Leerzeichen) ein!

Dann ist die Frage, wann endet denn deine Eingabe? Ist der Text nur eine Zeile lang? Dann solltest du evtl. lieber die Funktion "get" verwenden, sonst kann es sein, das du bei überlangen Zeilen nicht alles einliest:
Code:
const unsigned int max = 100;
char buffer[max];
while (cin.get (buffer, max, '\n')) {
   dat_aus << buffer;
   if (cin.peek() == '\n') {
      // edit: das Zeilenende wegwerfen
      cin.ignore();
      break;
   }
}
 
Zuletzt bearbeitet:
danke für deine Antwort, aber ich habe mein Problem ein wenig anderst gelöst. Mein getline.cin wurde ja immer übersprungen. So habe ich es mit flush gelöst. Hier nochmal der Code, der jetzt auch geht.

Code:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main ()

{
	ofstream dat_aus;
	string dateiname;

	cout <<" Geben Sie den Namen der Datei ein: ";
	cin >> dateiname;
	cout<< endl;
	dat_aus.open(dateiname.c_str(), ios_base::out);

	if(!dat_aus)
	{
		cout << " Datei konnte nicht geoeffnet werden";
		cout <<endl;
		return -1;
	}

	
    string text1; 

cout <<" Gib deinen Text ein der gespeichert werden soll: "<<flush; 
fflush(stdin);
getline(cin,text1);


dat_aus << text1 <<endl;

dat_aus.close(); 

return 0; 

}


Danke nochmal an die die mir geholfen haben
 
Also bei mir funktioniert das nicht mit flush (OS: Linux (Redhat), Compiler GCC 4.0.1).

Auch das Aufrufen der Methode sync des Eingabestreams brachte nichts. Angeblich war auch kein Zeichen mehr im Puffer ( cin.rdbuf()->in_avail war gleich 0, obwohl tatsächlich noch ein Newline im Eingabepuffer war). Erst folgender Code brachte dann den gewünschten Effekt:
Code:
  cin.clear();
  cin.sync();
  cin.ignore(cin.rdbuf()->in_avail());
  while (cin.peek() == '\n') cin.ignore();
Die letzte Zeile ist in meiner Umgebung absolut notwendig, ansonsten wird die Eingabe übersprungen.

Ich werde nochmal zu Hause mit anderen Compilern schauen was damit rauskommt. Ich halte das für einen Fehler.
 
Zurück