Programm lädt Daten nicht mittels ifstream aus
-
Du hast den Header <fstream> vergessen.
Es sieht nicht so aus, als ob du stdio.h und stdlib.h benutzen würdest. die beiden sind ohnehin veraltet.
Du solltest/darfst nicht einfach so main() in sich selbst aufrufen.
-
Vielen Dank!

Aber wie könnte ich das Menü nach erfolgreichem Nutzen eines Menüpunktes wieder aufrufen?
-
Manuh schrieb:
Vielen Dank!

Aber wie könnte ich das Menü nach erfolgreichem Nutzen eines Menüpunktes wieder aufrufen?
Mit Schleifen.
Du solltest dir wirklich einmal ein ordentliches Buch und/oder Tutorial für Anfänger vornehmen, da werden solche Dinge alle behandelt. Ein wenig zu experimentieren ist zwar durchaus gut um das gelernte zu vertiefen, aber mit Dingen zu experimentieren die du noch nicht behandelt hast, heißt, im Trüben zu fischen udn führt zu nichts.
-
danke, ich bin auch gerade an einem Tutorial dran. Jedoch kam mir dann dieses Programm als Idee, und ich denke dass ich damit viele Sachen besser verstehe. Habe jetzt noch ein Problem..
Mein Programm:
/* Geldverwaltung Version 0.1 by Manuel Schwarz letzte Änderungen: 06. Aug. */ #include <iostream> #include <stdio.h> #include <stdlib.h> #include <fstream> using namespace std; int main(){ //Variablen int eingabe=0; float guthaben; float auszahlung; //DATEN EINLESEN ifstream cinsert("cdata.sav"); if(cinsert.is_open()) { guthaben = 0; cinsert>>guthaben; cinsert.close(); }; //Menü while(eingabe!=5){ system("clear"); cout<<"Geldverwaltung - Version 0.1"<<endl; cout<<"Made by: Manuel Schwarz"<<endl<<endl<<endl; cout<<"Auswahl:"<<endl; cout<<"1. Einzahlung"<<endl; cout<<"2. Auszahlung"<<endl; cout<<"3. Berechnung"<<endl; cout<<"4. Kontostand anzeigen"<<endl; cout<<"5. Programm beenden"<<endl<<endl; cout<<"Bitte geben Sie die zutreffende Nummer ein:"; cin>>eingabe; //Einzahlung if(eingabe==1){ system("clear"); cout<<"\n\n Einzahlung"<<endl<<endl; cout<<"Ihr Aktuelles Guthaben betraegt: "<<guthaben<<" EUR."<<endl; cout<<"Wie viel Geld soll eingezahlt werden?"<<endl; cin>>einzahlung; guthaben+=einzahlung; //Speichern ofstream cinsert("cdata.sav"); if (cinsert.is_open()) { cinsert<< guthaben; cinsert.close(); }; cout<<"\n\nEinzahlung erfolg! Ihr Guthaben betraegt nun: "<<guthaben<<" EUR."<<endl; main(); } //Auszahlung if(eingabe==2){ system("clear"); cout<<"\n\n Auszahlung"<<endl; } //Berechnung if(eingabe==3){ system("clear"); cout<<"\n\n Berechnung"<<endl; } //Kontostand anzeigen if(eingabe==4){ system("clear"); cout<<"\n\n Kontostand anzeigen"<<endl; cout<<"Ihr Aktuelles Guthaben betraegt: "<<guthaben<<" EUR."<<endl; } } if(eingabe==5){ system("exit"); } }Ich kann aber irgendwie keine 2 3 und 4 eingeben. Dann wird die Zahl gelöscht und da steht weiterhin: "Bitte geben Sie die zutreffende Nummer ein:"
Wieso?
Danke nochmal
Gruß
Manuh
-
Manuh schrieb:
Ich kann aber irgendwie keine 2 3 und 4 eingeben. Dann wird die Zahl gelöscht und da steht weiterhin: "Bitte geben Sie die zutreffende Nummer ein:"
Wieso?
Weil dein Programm den Bildschirm löscht, dann die gewünschte Ausgabe macht, dann den Bildschirm wieder löscht und das Menü wieder hinmalt. das ganze geht so schnell das du es nicht siehst.
Ansonsten solltest du dringend pumuckls Ratschläge befolgen. Außerdem ist von der Benutzung von system generell abzuraten, ganz besonders system("exit") - da gibt es sogar einen eigenen C++ Befehl für.
-
Ein gutes Deutsches Tutorial:
http://www.cpp-tutor.de/cpp/hinweise.html
if(eingabe==5){ system("exit"); } ersetzt mal system("exit"); mit: return 0;
-
SeppJ schrieb:
Du solltest/darfst nicht einfach so main() in sich selbst aufrufen.
Weil ?
EDIT: Hoffentlich hat niemand auf den Link geklickt, der war nicht zu diesem Thema ^^
-
Tim06TR schrieb:
SeppJ schrieb:
Du solltest/darfst nicht einfach so main() in sich selbst aufrufen.
Weil ?
1. Weil es vom Standard her verboten ist.
2. Weil es hier überhaupt keinen Sinn macht. Der Stackoverflow kommt mit Sicherheit, einfach durch die normale Benutzung des Programmes.Grüssli
-
Tim06TR schrieb:
Weil ?
Weil is so:
Der böse, böse Standard, §3.6.1,3 schrieb:
The function main shall not be used (3.2) within a program. The linkage (3.5) of main is implementation-defined. A program that declares main to be inline or static is ill-formed. The name main is not otherwise reserved.
-
pumuckl schrieb:
Tim06TR schrieb:
Weil ?
Weil is so:
Der böse, böse Standard, §3.6.1,3 schrieb:
The function main shall not be used (3.2) within a program. The linkage (3.5) of main is implementation-defined. A program that declares main to be inline or static is ill-formed. The name main is not otherwise reserved.
Was übrigens noch interessant zu wissen ist: In ANSI C ist es tatsächlich erlaubt, main rekursiv aufzurufen.
-
SeppJ schrieb:
Was übrigens noch interessant zu wissen ist: In ANSI C ist es tatsächlich erlaubt, main rekursiv aufzurufen.
Macht es dort mehr Sinn? Ein rekursiver
main()-Aufruf sollte so gut wie immer durch eine Schleife ersetzbar sein. Im Notfall gibts ja nochgoto...
-
Nexus schrieb:
SeppJ schrieb:
Was übrigens noch interessant zu wissen ist: In ANSI C ist es tatsächlich erlaubt, main rekursiv aufzurufen.
Macht es dort mehr Sinn? Ein rekursiver
main()-Aufruf sollte so gut wie immer durch eine Schleife ersetzbar sein. Im Notfall gibts ja nochgoto...
Sinn kann ich nicht erkennen, es ist nur nicht verboten. Interssehalber habe ich's mal mit der klassischen Anwendung für Rekursion versucht:
faculty.c
#include <stdlib.h> #include <stdio.h> int main(int argc, char * argv[]){ if (argc>=2){ int i = atoi(argv[1]); if (i>0){ sprintf(argv[1],"%d",i-1); return i*main(argc,argv); } else return 1; } }Gibt die Fakultät des ersten Kommandozeilenarguments als Fehlercode zurück. Hätte man natürlich auch ganz einfach in eine Unterfunktion packen können, sehr sinnvoll ist es daher nicht.
(Entschuldigung für mein wahrscheinlich sehr schlechtes C - ich benutze es normalerweise nicht)
edit: Und wie ich sehe funktioniert es bei mir nur bis 5 richtig. Ob das jetzt ein Programmfehler ist oder eine Beschränkung meiner Shell mag ich nicht testen.