Programm lädt Daten nicht mittels ifstream aus



  • 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


  • Mod

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


  • Administrator

    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.


  • Mod

    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 noch goto ... 😉


  • Mod

    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 noch goto ... 😉

    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.


Anmelden zum Antworten