Technician Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Folgendes Problem: Es soll eine beliebig lange Zeichenkette, die auch Returns enthalten kann, eingegeben und in einer Variablen abgelegt werden. Durch [Tab], [Enter] soll die Eingabe abgeschlossen sein. Wer hat eine Idee, wie ich das machen könnte? Als Variable wäre char* eigentlich geeignet (wegen Länge) - aber wie mach ich da bloß die Eingabeoperation :confused: Oder gibt es da eine Möglichkeit mit einem variablen Array (aber wie geht das bloß???) Die eingegebenen Zeichen sollten danach in eine Datei geschrieben werden. Mit ofstream Myfile Myfile.open(path, ios::out|ios::nocreate|ios::binary, filebuf::sh_write); greife ich auf die Datei zu. Wer hat einen Tipp??? Gruß und schon mal vielen Dank für alles was mich weiterbringt! Technician Zitieren
root@localhost Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 is aber dann nich so gut wenn im text mal ein tab und ein newline hintereinander sind! Zitieren
Technician Geschrieben 10. Juni 2002 Autor Geschrieben 10. Juni 2002 Original geschrieben von root@localhost is aber dann nich so gut wenn im text mal ein tab und ein newline hintereinander sind! Das kann in den Texten nicht vorkommen! Es wären ja auch beliebig andere Zeichenfolgen möglich, die den Text abschließen! Mir geht es ja nur darum, wie kann ich eine beliebig lange Zeichenfolge einlesen! Ein Array mit z.B. 1000 Elementen erstellen - das will ich keinesfalls; bei den Texten die da eingegeben werden, können welche dabei sein die weit über 1000 Zeichen haben, aber auch welche mit nur einem Zeichen... In ein char* etwas von Tastatur einlesen - das geht ja nicht, oder? Gruß, Technician Zitieren
Technician Geschrieben 10. Juni 2002 Autor Geschrieben 10. Juni 2002 Original geschrieben von Daragon Was eine Möglichkeit wäre, ist wenn du die GUI nutzt und die Eingabe einfach in nem Feld füllen läßt und dann mit nem Click() auf nen Button mit der Aufschrift "Senden" oder wie auch immer dann die Daten in die Datei verschiebst. Dann wäre auch das Problem mit den Mehrfachen Returns etc. gelöst. Ich möchte aber keine GUI erstellen, sondern ein reines Konsolenprogramm. (Außerdem, ich kenne mich mit GUIs unter C++ auch noch gar nicht aus.) Mein Programm soll zur Demonstration des RSA-Algorithmus und evl. weiterer kryptografischer Algorithmen dienen. Das mit den Returns ist wirklich egal. Ich hab schon so gut wie alles gelöst was das Programm an sich angeht, arbeite aber derzeit noch mit einem 1000-Elemente-Array... Zitieren
Technician Geschrieben 10. Juni 2002 Autor Geschrieben 10. Juni 2002 Original geschrieben von Daragon Ich weiß jetzt nicht ob das funktioniert oder du das so machen willst: Leg einfach ein ziemlich großes Array an, was halt maximal rein gespeichert werden kann oder halt ein ziemlich großes. Dann nachdem die Eingabe erfolgt ist, machst du ein strlen(), legst in der entsprechenden Größe ein Array an, speichert deinen Text da rein und löschst das alte Standart Array. Das wäre die einzigste Lösung, die mir einfällt. Es ist nur die Frage ob du sowas machen willst. Darauf bin ich auch schon gekommen - wäre halt ein "Notbehelf". Nur mich würde interessieren, ob es da nicht eine Möglichkeit gibt, das "direkt" zu lösen, denn ein "maximal" gibt es eben nicht. Z.B. mit irgendwelchen variablen Arrays... weiß auch nicht genau... Zitieren
Orffi Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Ich schließe aus Deinem Quelltext, daß Du C++ benutzt. In C++ gibt es die Klassen string und stringstream. Die kannst Du Dir ja mal ansehen, die organisieren den Speicherbedarf selber. HTH Jan PS: In ein char* etwas von Tastatur einlesen - das geht ja nicht, oder? Das kann nicht gehen, weil Du für char* ja Speciher beschaffen mußt und Du letztendlich wieder beim Array-Problem bist Zitieren
Hoppo Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Jo Mann ich hab nen Plan wie das geht Pass auf: also ersmal ne Schleife, und dann ne eingabe /////////////////////////////////// char Eingabe char String[8192]; int count=0; do{ Eingabe = getc(); //Liest ein Zeichen in die var Eingabe if(Eingabe == 09) // Wenn Tabulatortaste gedrückt { String[count] = 0; //String abschliessen break; // aus der schleife springen } else { String[count++] = Eingabe; //Die Eingabe in den String einfügen printf("%c", Eingabe); // und Eingabe ausgeben } }while(1); /////////////////////////////// Zitieren
Orffi Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Und was machts Du, wenn jemand mehr als 8192 Zeichen eingeben will? Dann hast Du ein Problem! Ich empfehle weiterhin string und stringstream, die in Standard-C++ enthalten sind. Jan Zitieren
Technician Geschrieben 10. Juni 2002 Autor Geschrieben 10. Juni 2002 Original geschrieben von Orffi Und was machts Du, wenn jemand mehr als 8192 Zeichen eingeben will? Dann hast Du ein Problem! Genau das meinte ich ja! Original geschrieben von Orffi Ich empfehle weiterhin string und stringstream, die in Standard-C++ enthalten sind. Werd mir dann heut abend mal stringstream zu Gemüte führen - und euch morgen von meinen (hoffentlich!) Erfolgen berichten! Gruß und Danke, Technician Zitieren
nic_power Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Schon mal was von dynamischer Speicherverwaltung gehoert ? Du verwendest einen relativ kleinen Eingabepuffer (2KB zum Beispiel), ist dieser voll kopierst Du die Zeichen in deinen Zielpuffer den Du (beispielsweise mit "realloc") dynamisch anpasst. Das ganze machst Du solange in einer Schleife, bis das Abbruchkrieterium erreicht ist. Nic Zitieren
Crush Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Der Speicher ist doch wohl wirklich nicht das Problem. Selbst bei 500 Anschlägen pro Minute schafft man am Tag kein Megabyte voll. Zitieren
nic_power Geschrieben 10. Juni 2002 Geschrieben 10. Juni 2002 Original geschrieben von Crush Der Speicher ist doch wohl wirklich nicht das Problem. Selbst bei 500 Anschlägen pro Minute schafft man am Tag kein Megabyte voll. Man sollte aber dennoch sauber programmieren. Stell Dir nur einfach mal vor, die Zeichen kommen nicht von der Tastatur sondern aus einer Pipe. Ohne vernuenftige Speicherverwaltung faellt man da schnell auf die Nase. Nic Zitieren
Technician Geschrieben 11. Juni 2002 Autor Geschrieben 11. Juni 2002 Original geschrieben von nic_power Schon mal was von dynamischer Speicherverwaltung gehoert ? Du verwendest einen relativ kleinen Eingabepuffer (2KB zum Beispiel), ist dieser voll kopierst Du die Zeichen in deinen Zielpuffer den Du (beispielsweise mit "realloc") dynamisch anpasst. Das ganze machst Du solange in einer Schleife, bis das Abbruchkrieterium erreicht ist. Nic Könntest du mir dazu ein Beispiel geben? Gruß, Technician Zitieren
Technician Geschrieben 11. Juni 2002 Autor Geschrieben 11. Juni 2002 So, Problem Nummero Eins wäre damit gelöst: Mit sstream kann ich beliebig lange Zeichenketten über die Tastatur einlesen: #include <iostream> #include <sstream> using namespace std; void main() { string s = “123“; cin>>s; cout<<s; } Sooo, Texte beinhalten aber auch Leerzeichen. cin bricht aber bei einem Leerzeichen bekanntlich ab. cin.getline funktioniert nicht mit dem Datentyp string. Hmmmm, wie mach ich das jetzt, dass er über die Leerzeichen drüber weiterliest? Und nochwas: Die in string s eingelesenen Daten sollen in eine Datei geschrieben werden. Erstens habe ich festgestellt, nach dem Einbinden der string-Headerdatei wird file.open nicht mehr akzeptiert. Zweitens, wie werden string-Werte auf Datei geschrieben? #include <iostream> #include <sstream> #include <string> #include <conio.h> #include <fstream> using namespace std; void main() { char c = 'a'; string s = "123"; cin>>s; cout<<s<<endl; ofstream file; file.open("D:\\text.dat", ios::in|ios::nocreate|ios::binary,filebuf::sh_read);//error C2039: 'nocreate' : Ist kein Element von 'basic_ios<char,struct std::char_traits<char> >' /*if(file.good()) { file.clear(); file.close(); file.open(path, ios::out|ios::nocreate|ios::binary, filebuf::sh_write); if(file.good()) file.write(myString, 10); //hier ist der Knackpunkt – was setz ich dafür ein??? file.close(); }; */ }; Wenn’s die string-Headerdatei schon gibt – dann muss sich da ja auch irgendwas auf Datei speichern lassen, oder? Es sollte doch wohl nicht so sein, dass string-Werte auf ewig zu einer flüchtigen Existenz im RAM verdammt sind, oder? :confused: Gruß, Technician *hoffnungsvoll* Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.