Problem bei ausgeben eines Datei Inhalts
-
danke, problem gelöst
-
Hmm das ist aber nen ganz schlechter Weg das einzulesen.
char puffer[100];Deine Zeile darf maximal 99 Zeichen lang sein!
case 'x': case 'X':<cctype> std::tolower
fstream about; about.open("readme.txt", ios::in);Du nutzt den Stream nur zum einlesen? std::ifstream.
if(about.good())std::ios hat den operator! und operator void* überladen.
while(!about.eof())EOF ... darauf sollte man nicht vergleichen. Sollte da eigtl. ein Zeichen zu viel einlesen ...
optimierte Lösung: Iteratoren.
#include <iostream> #include <fstream> #include <iterator> #include <vector> #include <iomanip> #include <string> #include <algorithm> std::istream& clear_stream(std::istream& in) { return in.clear(), in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } template <typename _Type> std::istream& type(std::istream& in, _Type& dest, std::string const& prompt, std::ostream& out = std::cout) { while (out << prompt << std::flush, !(clear_stream(in) >> dest)) out << "Falsche Eingabe!" << std::endl; return in; } struct menu { std::vector<std::string> items; std::size_t selection; menu() : selection(0) {} friend std::ostream& operator << (std::ostream& out, menu const& data) { for (std::size_t i(0); i < data.items.size(); ++i) out << "(" << i + 1 << ") " << data.items[i] << std::endl; return out; } friend std::istream& operator >> (std::istream& in, menu& data) { while ((type<std::size_t>(in, data.selection, "Auswahl: "), data.selection) > data.items.size()) std::cout << "Falsche Eingabe!" << std::endl; return in; } }; int main() { menu my_menu; my_menu.items.push_back("Starten"); my_menu.items.push_back("Readme"); my_menu.items.push_back("Beenden"); std::cout << my_menu; std::cin >> my_menu; while (my_menu.selection != 3 /* Beenden */) { switch (my_menu.selection) { case 1: { } break; case 2: { std::ifstream file_stream("readme.txt"); if (!file_stream) { std::cerr << "FEHLER: \"readme.txt\" konnte nicht geöffnet werden!" << std::endl; break; } std::copy(std::istream_iterator<char>(std::cin >> std::noskipws), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, "")); } break; default: { std::cout << "Nicht implementiert!" << std::endl; } break; } } }Wobei das auslesen dabei auf den Dreizeiler:
std::ifstream file_stream("readme.txt"); if (!file_stream) { std::cerr << "FEHLER: \"readme.txt\" konnte nicht geöffnet werden!" << std::endl; break; } std::copy(std::istream_iterator<char>(std::cin >> std::noskipws), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, ""));reduziert ist.
-
Schrecklicher Coding-Stil

-
nicht wirklich ^^ wenn du den nicht verstehst, solltest du dich evtl. weiterbilden

-
Das hat nix mit nicht verstehen zu tun. Diese komische menu struct ist total übertreiben um n array auszugeben und ne Zahl einzulesen. Und wieso dann nicht class? Und warum immer 10 Anweisungen in einer Zeile. Noch übersichtlicher wirds, wenn du gleich alles in struct in eine Zeile schreibst.

-
Hmm, also weiß nicht was du mit 10 Anweisungen in einer Zeile meinst. Wenn man den Komma-Operator nutzt ist das deswegen nicht direkt Unübersichtlicher.
Warum struct? Weil default-zugriff public ist und eine struct ansonsten identisch zu einer class ist ...
Warum in einer struct? Weil es wiederverwenbar ist.
-
Hallo (D)Evil,
gib doch einfach zu das du nicht gut programmieren kannst. Danke.
-
Hmm okay ich gebe zu, dass meine Fähigkeiten beim Programmieren eher mickrig ausfallen. Bin ja auch erst 15, von d.h. ist es ja vielleicht verständlich.
Mit freundlichen Grüßen
(D)Evil
-
das alter hat nur bedingt was damit zu tun ich bin erst 14...
ich gebe zu ich hab auch net die besten kenntnisse, aber ich krieg schon einiges hin.
-
ich gebe zu ich hab auch net die besten kenntnisse, aber ich krieg schon einiges hin.
Die Frage ist wie.
Hallo (D)Evil,
gib doch einfach zu das du nicht gut programmieren kannst. Danke.
Hab ich ja nun. Evtl. zeigst du uns mal ein wenig Code von dir. Danach reden wir weiter :xmas2:
@Yazoo: Hmm. Achja, auch wenn das jetzt evtl. auf den ersten Blick vom Code her etwas unübersichtlich aussieht. Hab es leider nur kurz hier ins Forum getippt und hab da jetzt nicht so auf Übersichtlichkeit geachtet. Es sollte eigtl. (fast) immer das Ziel sein, seinen Code möglichst zu Modulisieren, d.h. dass du ihn wiederverwenden kannst.
Z.B.: kann ich die Funktion clear_stream mittlerweile schon jede Woche einmal mindestens hier schreiben, weil wieder ein Anfänger herkommt und sich fragt warum denn nu die Konsole schließt und warum in den F.A.Q. denn bitte noch eine falsche Version steht?! Nunja.
Die Funktion type hab ich dem Fall relativ einfach gehalten, wobei ich dabei verstehen kann, wenn du nicht mit dem Komma-Operator in der while-Schleife klar kommst. Sieht etwas verwirrend aus, bewirkt aber einfach, dass erst deine Variable prompt ausgegeben wird und danach versucht wird die Eingabe des Users zu bekommen. Normal ist auch die ein template, um unabhängig vom Zeichensatz zu sein.Du könntest die Struktur menu natürlich auch in die main mit reinpacken. Doch wo wäre der Vorteil? Den gibt es nicht! Denn dadurch wird es wirklich unleserlich! Und wiederverwenden kannst du es auch nicht?! So hast du dynamisch deine Strings zum Menu-Eintrag und lässt dann einfach dein Menu anzeigen (operator <<) und ließt dann die Auswahl des Benutzers ein (operator >>). Eigtl. ist das ein sehr einfacher Ansatz das umzusetzen. Ich gehe allerdings davon aus, dass Werner Salomon evtl. ein besserer Einfall gelungen wäre, da er noch ein wenig besser mit den Algorithmen und Pattern des Standards vertraut ist.
Bei deinem Code war z.B. nicht geregelt, was passiert, wenn der User mal irgend einen Murks eingibt.
Dein Code zum einlesen der Datei war auch schlicht unsicher & falsch. Wie man das sauber löst, hab ich dir auch in den Code integriert.
Von d.h. ist es ziemlich lächerlich meinen Code-Style als schlecht zu bezeichnen. Wenn der Herr sich bitte Registrieren würde, wäre ich auch gerne Bereit seine Kritikpunkte zu meinem Code-Style zu beachten. Da er aber bisher keine sinnvollen Argumente gebracht hat, was an meinem Stil verbesserungswürdig ist, sollte er sich geschlossen halten.
@Yazoo: Es war sicherlich nicht ernst gemeint, dass ich 15 bin und ich soo schrecklich schlecht Programmiere. Das ich nicht unbedingt so gut in C++ bin wie vllt ein Bjarne Stroustrup ist mir durchaus bewusst, denn er ist immerhin der Entwickler der Sprache. Auch Werner Salomon übertrifft mich bei weitem. DU aber noch sehr lange nicht. Ich gebe zu das mein Wissen in manchen Bereichen Schwachstellen aufweist, doch kein Mensch ist perfekt und beim Programmieren lernt man NIE aber auch wirklich NIE aus.
-
(D)Evil schrieb:
@Yazoo: Hmm. Achja, auch wenn das jetzt evtl. auf den ersten Blick vom Code her etwas unübersichtlich aussieht. Hab es leider nur kurz hier ins Forum getippt und hab da jetzt nicht so auf Übersichtlichkeit geachtet.
solltest du aber machen. im überfliegen ist der code nicht klar, ein paar leerzeilen und abstände mehr schaden schon nicht.
Es sollte eigtl. (fast) immer das Ziel sein, seinen Code möglichst zu Modulisieren, d.h. dass du ihn wiederverwenden kannst.
schön und gut, aber der OP hat nichts davon, wenn du eine komplette lösung anbietest, denn (1) du weißt gar nichts über seine konkrete situation und jedes design hat seine flaws. (2) lenkt der viele zusätzliche code ab. regel: die markante stelle, um die es geht, ausbessern & anmerkungen zum rest geben. alles-in-eine-zeile-packen ist leserunfreundlich.
außerdem:
int main () { string in; type (cin, in, "foo: "); cout << in; }verhält es sich wie erwartet? nein.
das liegt daran, dass du den istream bereits *vor* der ersten eingabe reinigst, und zwar im schleifenkopf. bringt dich sicher nicht um, die schleife auszubauen und das clear_stream nach unten zu setzen.das sind hinweise, die du zuerst sagen solltest, bevor du einen fertigen code präsentierst:
Bei deinem Code war z.B. nicht geregelt, was passiert, wenn der User mal irgend einen Murks eingibt.
Dein Code zum einlesen der Datei war auch schlicht unsicher & falsch. Wie man das sauber löst, hab ich dir auch in den Code integriert.
Von d.h. ist es ziemlich lächerlich meinen Code-Style als schlecht zu bezeichnen. Wenn der Herr sich bitte Registrieren würde, wäre ich auch gerne Bereit seine Kritikpunkte zu meinem Code-Style zu beachten. Da er aber bisher keine sinnvollen Argumente gebracht hat, was an meinem Stil verbesserungswürdig ist, sollte er sich geschlossen halten.
manchmal ist es ganz praktisch, mehr als eine anweisung in eine zeile zu packen. aber nur manchmal. den kommaoperator dafür verwenden ist sicher ein beispiel, dass die übersichtlichkeit nicht erhöht. warum nicht zwei zeilen draus machen? vor allem, wenn es dann zu ergebnissen führt, wie oben. btw: mit underscore am besten nie einen bezeichner beginnen (_Type bspw.)
die einfachste und effektivste art, eine datei auszugeben, ist übrigens:
cout << filestream.rdbuf();