Sätze einlesen
-
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;?
-
Das liest bis zu 255 Zeichen ein oder bis die Zeile zuende ist.
Darf ich übrigens mal so neugierig sein, warum du überhaupt die Zeilenlänge begrenzen willst?
-
leider macht es genau das nicht.
hab es jetzt viel einfacher versucht:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>using namespace std;
void main ()
{
ofstream ausgabe;string dateiname;
//einlesen des Dateinamens
cout << " Dateiname: ";
cin >> dateiname;
cout << endl;ausgabe.open(dateiname.c_str(), ios_base::out);
//Daten in die Datei schreiben
string text1;
getline(cin, text1);
ausgabe << text1;
cout << text1 << endl;}
wenn ich das kompiliere dann kann ich nur einen Dateinamen eingeben und sonst nichts und das kann ja nicht sein weil ich in der getline Funktion nicht angegeben habe wann schluss sein soll.
Ich möchte einfach nur eine Zeile einlesen und wenn ich die mit Enter bestätige dann soll Sie gespeichert werden.

-
Das beantwortet aber nicht warum du die Länge begrenzen möchtest.
Simon
-
möchte einfach nur eine Zeile einlesen und das versuch ich halt auf verschiedenen Wegen.
-
morisq schrieb:
möchte einfach nur eine Zeile einlesen und das versuch ich halt auf verschiedenen Wegen.
Du hattest doch schon eine super Lösung mit getline und String. Das jetzt mit dem anderen getline und char-Arrays zu versuchen ist doch nur unnötiges Gefrickel. Jeder C++-Programmierer würde string nehmen, solange ihn nicht irgendein anderer Umstand zu Arrays zwingt.
-
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>using namespace std;
void main ()
{
ofstream ausgabe;string dateiname;
//einlesen des Dateinamens
cout << " Dateiname: ";
cin >> dateiname;
cout << endl;ausgabe.open(dateiname.c_str(), ios_base::out);
//Daten in die Datei schreiben
string text1;cout << " Text der gespeichert werden soll: " << endl ;
getline(cin, text1);
ausgabe << text1;
cout << text1 << endl;}
ok dann möchte ich letzten Endes nur noch wissen warum ich hier bei dem Code keinen Text eingeben kann sondern die Konsolenanwendung direkt nach Eingabe eines Dateinamens wieder geschlossen wird??
Und wie eine Lösung für dieses Problem genau aussieht.Ich nutze Visual 2008
-
Könntest du bitte mal CPP Tags verwenden?
Und wenn ich mal raten darf. Der Dateiname enthält ein Leerzeichen?

Grüssli
-
nein er enthält kein leerzeichen und was Cpp tags sind weiß ich nicht.
Wenn ich das Programm mit Visual c++ 6.0 ausführe klappt alles
aber mit Visual Studio 2008 nicht und das kann ja net sein.
Muss man bei VS 2008 etwas anders machen??
-
Cpp-Tags (findet man gleich unterhalb der Smilies):
#include <iostream> //#include <cstdlib> brauchst du nicht #include <fstream> #include <string> using namespace std; int main () // void main() gibt es nicht. { ofstream ausgabe; string dateiname; //einlesen des Dateinamens cout << " Dateiname: "; cin >> dateiname; cout << endl; ausgabe.open(dateiname.c_str(), ios_base::out); //Daten in die Datei schreiben string text1; cout << " Text der gespeichert werden soll: " << endl ; getline(cin, text1); ausgabe << text1; cout << text1 << endl; }Problem liegt bei der Eingabe des Dateinames. Wenn man Enter drückt, wird in den Stream ein
\r\nreingeschrieben. Das wird aber nicht ausgelesen, sondern nur der Dateiname davor. Danach sagst du, dass du eine Linie einlesen möchtest. Es liest somit bist zum nächsten\r\n, also genau 0 Zeichen
Lies den Dateinamen auch gleich mit
getlineein und das Problem ist weg. Und VS 6.0 solltest du in die Mülltonne schmeissen.Grüssli
-
jetzt klappt es!

vielen Dank an alle
#include <iostream> #include <cstdlib> #include <fstream> #include <string> using namespace std; void main () { ofstream ausgabe; string dateiname,text1; //einlesen des Dateinamens cout << " Dateiname: "; getline(cin, dateiname); ausgabe.open(dateiname.c_str(), ios_base::out); //Daten in die Datei schreiben cout << " Text der gespeichert werden soll: " << endl ; getline(cin, text1); ausgabe << text1; cout << " der gespeicherte Text ist: " << endl << endl; cout << text1 << endl; system("pause"); }void damit man keinen Wert zurückliefern muss, für int muss über return .. eine integer Variable rückgeliefert werden sonst motzt der Compiler.
Und cstdlib.h wegen system("pause").Jap ich arbeite nur noch mit VS 2008.