Sätze einlesen
-
Hallo zusammen.
Ich bin Anfänger im Bereich C++ Programmieren und möchte gerade in einer Konsolenanwendung Sätze einlesen und diese in einer Datei speichern.
Mein Quellcode sieht folgendermaßen aus:#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>using namespace std;
int main()
{
ofstream auslesen;
string dateiname;
cout << "Geben Sie den Namen der Datei ein: ";
cin >> dateiname;
cout << endl;
auslesen.open(dateiname.c_str(), ios_base::out);if(!auslesen)
{
cout << "Datei konnte nicht ge\x94" << "ffnet werden!";
cout << endl;
return -1;
}
string text1;
cout << " Was soll in die Datei geschrieben werden? :" << endl;
getline(cin, dateiname);
cin >> text1;
auslesen << text1 << endl;
return 0;
system("pause");
}Kann mir jemand erklären was ich falsch mache? Es wird nur das erste Wort meines Satzes in die Datei geschrieben.
Danke
MfG
-
Wenn man den istream-operator >> auf einen string anwendet, wird die Eingabe nach Leerzeichen (und anderen whitespaces) aufgetrennt. Das Enter-Zeichen hat für diesen Operator nämlich keine besondere Bewandnis. Wenn du stattdessen zeilenweise einlesen willst, nutze getline.
edit: Und denke mal über deinen Programmfluss etwas nach. Es ist wegen der fehlenden Formatierungstags im Forum etwas schwer zu lesen, aber beim Überfliegen kommt mir das doch ein wenig wirr vor. Zum Beispiel liest du den Dateinamen zweimal ein.
-
Danke für die schnelle Antwort.
Ich nutze doch gereits getline.
Kannst du mir im Code zeigen was du konkret meinst, und wo lese ich den Dateinamen 2 mal ein?
-
morisq schrieb:
Danke für die schnelle Antwort.
Ich nutze doch gereits getline.Für den dateinamen. Aber nicht für text1, den du hinterher in die Datei schreibst.
Kannst du mir im Code zeigen was du konkret meinst.
Ich bin zuversichtlich, dass du das selber hin bekommst.
-
Ok es funktioniert nun, allerdings wird mein letztes Wort geschluckt, woran liegt das?
-
entschludige, das erste Wort wird geschluckt.
-
morisq schrieb:
Ok es funktioniert nun, allerdings wird mein letztes Wort geschluckt, woran liegt das?
Vielleicht weil Du
while(einlesen){ einlesen>>wort; ... }statt
while(einlesen>>wort){ ... }oder
for(;;){ einlesen>>wort; if(!einlesen) break; ... }gemacht hast.
-
Tut mir leid aber das verstehe ich jetzt nicht, ich bin wie gesagt Anfänger.
In meinem Code kommen die von dir aufgezählten Beispiele nicht vor.
-
morisq schrieb:
entschludige, das erste Wort wird geschluckt.
Vielleicht weil vom cin>> noch das \n im cin steckt und sich das nicht ideal mit einem folgenden readline verträgt.
-
morisq schrieb:
Tut mir leid aber das verstehe ich jetzt nicht, ich bin wie gesagt Anfänger.
In meinem Code kommen die von dir aufgezählten Beispiele nicht vor.Ich ging davon aus, daß Du schon ein wenig weiter gebastelt hast, denn die Frage, warum die letzte Zeile nicht klappt, taucht eigentlich erst auf, wenn Du eine Schleife eingebaut hast.
-
das ist mein aktueller Code:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>using namespace std;
int main()
{
ofstream auslesen;
string dateiname;
cout << "Geben Sie den Namen der Datei ein: ";
cin >> dateiname;
cout << endl;
auslesen.open(dateiname.c_str(), ios_base::out);string text1;
cout << " Was soll in die erste Zeile der Datei geschrieben werden? :"
cout << endl;
cin >> text1;
getline(cin,text1);
auslesen << text1 << endl;return 0;
system("pause");
}ich glaube ich bin zu blind den Zeilenumbruch in cin zu finden ich sehe da keinen

-
morisq schrieb:
Nach
[cpp]
cout << " Was soll in die erste Zeile der Datei geschrieben werden? :"
[cpp]fehlt ein Semikolon. Deswegen hat Dein Editor die folgezeile auch nicht hübsch eingerückt.
-
Das erste Wort wird bei dir mit
cin >> text1;gelesen und in der Zeile danach wird das was in text1 steht mit dem Rest der eingegebenen Zeile überschrieben. Daher bekommst du am Ende in text1 alles außer das erste Wort.
-
ok Danke euch.
Jetzt ist mir das Problem klarer.
Ich denke den Rest kriege ich selbst hin.Das semikolon im Quelltext natürlich Vorhanden @ Volkard, mein Compiler motzt sonst wegen der Syntax.
-
ich habe das ende nun abgeändert in folgende Form:
getline(cin, text1, 'n');
auslesen << text1;
system("pause");
return 0;wie kann ich die länge des eingegebenen Satzes steuern?
-
morisq schrieb:
wie kann ich die länge des eingegebenen Satzes steuern?
Was meinst du damit genau? Möchtest du die Eingabe nach einer gewissen Zeichenzahl abschneiden? Falls ja, dann ist getline nicht die richtige Wahl, da es, wie der Name sagt, zeilenweise einliest. Da bietet sich eher read an, welches stumpf eine vorgegebene Anzahl Zeichen einliest. Das arbeitet dann aber nicht so schön mit string zusammen. Jedenfalls muss schon vorher Platz für die gelesenen Zeichen vorhanden sein und man gibt dem read dann nur einen Zeiger auf das erste Zeichen. Das kann man erreichen, indem man ein vorher resize auf den string anwendet.
Da ich mir schon denken kann, welche Frage als nächstes kommt:
Auf www.cplusplus.com findest du eine Referenz zu C++. Dort kannst du einfach getline, read, resize und so in die Suchmaske eintippen und dir eine Beschreibung mit Beispiel angucken. Oder du stöberst direkt über das Inhaltsverzeichn is und guckst dir beispielsweise die istream und string Referenzen an.
-
Danke für den Tipp

Ich habe es versucht wie im Beispiel: mit.
.
.
.
char text1[256];
cin.getline(text1,256,'n');
.
.
.es werden aber immer nur 17 der von mir eingegebenen Zeichen gespeichert.
Steuere ich nicht über die Zahl hinter der char deklaration meine Länge?
-
Du steuerst die Anzahl über die Zahl beim getline. Das getline wird dann bis zu dieser Zeichenzahl lesen oder bis es das Trennzeichen, bei dir 'n', findet, je nachdem was vorher passiert.
Sei dir aber im Klaren, dass 'n' der Buchstabe n ist, nicht das Enter-Zeichen. Dieses ist '\n'. Ist das vielleicht der Fehler, weil deine Eingabe nach 17 Zeichen ein n enthält?
Und über die Anzahl der Zeichen bei der char-Deklaration steuert man in C++ überhaupt nie etwas. Diese Zahl können Funktionen denen du das Array übergibst nicht selber herausfinden, deshalb musst du die Zahl beim getline auch mit übergeben. Das ist oft ein großes Problem für Anfänger und deshalb sollte man Arrays auch eher vermeiden, sie sind eher ein Relikt aus alten Zeiten.
-
ok ich muss es für doofe wissen.
was muss ich an 3. Stelle in die getline() schreiben damit ich die Länge des einzulesenden Satzes steuern kann?
Schreibe ich 'n' bricht er beim ersten geschriebenen n logischerweise ab, schreibe ich '\n' dann kann ich gar nichts mehr eingeben, und schreibe ich eine zahl kommt eine fehlermeldung im Compiler.
Ich habe es schon richtig verstanden das an der Stelle wo ich das 'n' geschrieben habe die Zeichenanzahl geschrieben wird?
-
also ist laut dem was ich gelesen habe folgender Code korrekt:
char array[256];
cout << " Was soll in die erste Zeile der Datei geschrieben werden? :" << endl;
cin.getline(array,256);
auslesen << array;?