Getline wird nicht beachtet
-
Ok danke und wie kann ich das beheben?
Was bedeutetpatrick246 schrieb:
ruf main nicht rekursiv auf.
?
Ist tatsächlich das Buch von Jürgen WOlf

-
JBHillmann schrieb:
Ok danke und wie kann ich das beheben?
Was bedeutetpatrick246 schrieb:
ruf main nicht rekursiv auf.
?
Schreib nicht main() als Funktionsaufruf.
-
Ahh ok danke
werd ich ändern
und was ist jetzt mit dem eigentlichen Problem? wie bekomm ich das \n
das im Eingabepuffer gammelt weg?
-
-
#include <limits> cin.ignore(numeric_limits<streamsize>::max(), '\n'); // verwirf max() Zeichen, bis du auf newline oder EOF stößt
-
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; //Vorwärtsdeklarationen sind eigentlich nicht nötig. Sinnlos viel Arbeit. //Schlechte Namen, als Leser erkenne ich nicht, was die machen. void rig(); void start(); void ver(); void ent(); void bad(); void ende(); //Uniforme Initialisierung ist hier fürn Popo. //Und bools mit 1 initialisieren? true!!! //Das ist ja C und kein C++. //sv? Sagt mir nix. bool sv1{1}, sv2{1}; int main() { if (::sv2) { rig(); } if (::sv1) { start(); } return 0;//darf man weglassen } void rig() { cout << "Krypto \n VERSION 1.3\n ENGLISH \n ALL RIGHTS RESERVED BY JBD \n";//\n am ENDE sv2=0;//false return;//störend } void start() { cout << "\n [A] Text encoding";//\n am ANFANG, inkonsistent. cout << "\n [B] Text decoding"; cout << "\n [E] End"; cout << "\n \n Your input: "; char want{0};//Wozu auf 0 setzen? Warum die häßliche {}-Syntax? cin >> want; switch (want) { case 'A': ver(); break; case 'a': ver(); break; case 'B': ent(); break; case 'b': ent(); break; case 'E': case 'e': ende(); break;//oder einfach so: default: bad(); } main();//verboten! } void ver() { string text;//später getline(cin, text); ofstream encode;//konstuktor encode.open("encode.txt");//konstruktor! encode << text; encode.close();//DESTRUKTOR!!! return;//sinnlos }
-
Ok Problem gelöst funktioniert nun

Vielen Dank an euch
und wiedermal sehe ich wie ich als Anfänger extrem viel zu lernen habe und das hier dinge kritisiert werden die ich meinem "Lernbuch" gleichtue...
Soll ich anstant Vorwärtsdeklarationen zu machen die main() ans Ende setzen?
-
JBHillmann schrieb:
Soll ich anstant Vorwärtsdeklarationen zu machen die main() ans Ende setzen?
Ja.
Und FALLS doch mal eine gebrauch werden würde, kannste immernoch eine machen.Hier wird sie gebraucht, weil sich Funktionen gegenseitig aufrufen. Aber der main()-Trick ist eh nicht gut.
-
Problem: Die start() gibt keinen bool zurück!
Gute Lösung:
int main() { cout << "Krypto \n VERSION 1.3\n ENGLISH \n ALL RIGHTS RESERVED BY JBD \n"; while(start()) ; }Seine start() gibt nix zurück, aber genau dort kann er nur feststellen, ob der Benutzer aufhören will. Also ruft der Auto die main() auf. Mit dem Problem, daß der Into-Text immer kommt und nicht nur einmal, also legt er globale Variablen an und schreibt
if (::sv2) { rig(); }Wie schrecklich. Und abgesehen von allen Dummheiten steckt einfach in jedem Detail Mist. Zum Beispiel hätte es sein sollen
if (sv2) { rig(); sv2=false; }dann sieht man hier, was das bedeuten soll: Nur einmal anzeigen. Die Zuweisung wegzuverstecken hilft doch genau gar keinem. Ich bin mit dem Code runherum nicht einverstanden.
-
volkard schrieb:
ofstream encode;//konstuktor encode.open("encode.txt");//konstruktor! encode << text; encode.close();//DESTRUKTOR!!! return;//sinnlos }und warum regt man sich hier über encode.close(); auf?
-
JBHillmann schrieb:
und warum regt man sich hier über encode.close(); auf?
Weil Du später Code schreiben wirst, der überall Exceptions werfen könnte, und da bringt close() nichts mehr. Also wozu erst angewöhnen?
-
Weil es unnötig ist. encode wird automatisch mit verlassen des Scopes geschlossen.
-
ohh ok also schlicht unnötig
-
ofstream encode;//konstuktor encode.open("encode.txt");//konstruktor!und hier ist was falsch? Ohne eins von beidem funktionierts nicht?
~(Edit v. Arcoth, Code-Tags)~
-
JBHillmann schrieb:
ofstream encode;//konstuktor
encode.open("encode.txt");//konstruktor!und hier ist was falsch? Ohne eins von beidem funktionierts nicht?
ofstream encode("encode.txt");//Diesen Konstruktor benutzen statt Defaultkonstruktor und open.
-
JBHillmann schrieb:
und warum regt man sich hier über encode.close(); auf?
Unnötiges Ressourcenschliessen ist ein typisches Anzeichen dafür, dass Leute RAII -- und damit eines der wichtigsten Konzepte in C++ überhaupt -- nicht verstanden haben.
-
Nexus schrieb:
JBHillmann schrieb:
und warum regt man sich hier über encode.close(); auf?
Unnötiges Ressourcenschliessen ist ein typisches Anzeichen dafür, dass Leute RAII -- und damit eines der wichtigsten Konzepte in C++ überhaupt -- nicht verstanden haben.
Ein close() hinauszuzögern nur weil der Code dadurch kompakter wird ist ein typisches Anzeichen dafür, dass Leute die Nachteile von RAII bewusst ignorieren.
Hier kommt es vielleicht auf das gleiche drauf raus, aber wenn schon mit Exceptions argumentiert wird darf ich auch den allgemeinen Fall betrachten:
ofstream encode("encode.txt"); encode << "test"; <berechnung> return <something>Die Datei wird hier erst am Ende des Scopes geschlossen. Die maximale Anzahl offener Dateien ist sehr beschrängt, wenn bei
<berechnung>nochmal eine Datei geöffnet wird, hat man u.U. Probleme. Besser:ofstream encode("encode.txt"); encode << "test"; auto position = encode.tellg(); // einfach damit man encode nicht so einfach in einen Block stecken kann endode.close(); // nicht mehr benötigt => sofort zumachen <berechnung> return <something>
-
releaseearlyandoften schrieb:
Die maximale Anzahl offener Dateien ist sehr beschrängt
lol. 16k oder mehr.
ofstream encode("encode.txt"); encode << "test"; <berechnung> return <something>Dein Fehler: Variablen nicht lokal gehalten und der Funktion keine klare Aufgabe gegeben.
-
SeppJ schrieb:
releaseearlyandoften schrieb:
Die maximale Anzahl offener Dateien ist sehr beschrängt
lol. 16k oder mehr.
16k sind nicht viel. Bei mir sind im Normalbetrieb 6k-7k offen (/proc/sys/fs/file-nr). Viele dateifressende Prozesse sind nicht so einfach zu verkraften.
ofstream encode("encode.txt"); encode << "test"; <berechnung> return <something>Dein Fehler: Variablen nicht lokal gehalten und der Funktion keine klare Aufgabe gegeben.
(Du hast wohl absichtlich die Zeile
auto position = encode.tellg(); // einfach damit man encode nicht so einfach in einen Block stecken kannignoriert. War schon klar, dass da jemand mit der Bemerkung kommt.)Sehr idealistische Sichtweise. Wenn du es schon genau nimmst:
string f() { ifstream input("input.txt"); string s; input >> s; return s; // s wird in Rückgaberegister kopiert: Kann u.U. lange dauern und ist sehr speicherintensiv // (C++11 mit Move-Semantik behebt dieses Beispiel aber lange nicht alle Probleme) // input wird geclosed und viel Speicher wird freigegeben. }Oder auch dieser typische Codeausschnitt:
vector<int> v = f(); int x = accumulate(v.begin(), v.end(), 0); v.clear(); // v wird nicht mehr benötigt, aber x schonSchreibst du da wirklich jedesmal eine eigene Funktion?
-
releaseearlyandoften schrieb:
SeppJ schrieb:
releaseearlyandoften schrieb:
Die maximale Anzahl offener Dateien ist sehr beschrängt
lol. 16k oder mehr.
16k sind nicht viel. Bei mir sind im Normalbetrieb 6k-7k offen (/proc/sys/fs/file-nr). Viele dateifressende Prozesse sind nicht so einfach zu verkraften.
Pro Prozess, du Experte! Aber da du dich ja offensichtlich viel besser auskennst, als jeder andere Mensch auf der Erde, brauche ich dir ja wohl mehr nicht zu erklären.