Zum Inhalt springen

Eingabe beliebig langer Zeichenketten


Technician

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

///////////////////////////////

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...