Textdatei einfügen



  • Hallo an alle,

    ich bin Student an der FH und habe am Donnerstag ein Praktikumsversuch. Hier ist mein Quellcode.

    #include <stdio.h>

    int scheine[7] = {500,200,100,50,20,10,5};
    int anzahl_scheine[7] = {0};

    int BetragEingeben(void);
    int AnzahlBerechnen(int, int);
    int Ausgabe(void);

    int main(void)
    {
    (void) AnzahlBerechnen(0,BetragEingeben());
    Ausgabe();
    return 0;
    }

    BetragEingeben(void)
    {
    int betrag=0;
    do
    {
    printf("Bitte auszuzahlenden Betrag eingeben: ");
    scanf("%i",&betrag);

    if(betrag%5!=0)
    {
    printf("Es koennen nur ganze Euro-Noten ausgegeben werden!\n\n");
    }

    }
    while(betrag%5!=0);

    return betrag;
    }

    AnzahlBerechnen(int array_element, int betrag)
    {
    int number_array_elements=(sizeof(scheine)/4);

    if (betrag>=scheine[array_element])
    {
    betrag=betrag-scheine[array_element];
    anzahl_scheine[array_element]=anzahl_scheine[array_element]+1;
    AnzahlBerechnen(array_element,betrag);
    }
    else
    {
    if (betrag!=0)
    {
    AnzahlBerechnen(array_element+1,betrag);
    }
    else
    {
    return betrag;
    }
    }

    }

    Ausgabe(void)
    {
    int array_size=(sizeof(scheine)/4);
    int i=0;

    printf("\n\nAusgabe Banknoten:\n");

    for (i=0; i<array_size; i++)
    {
    printf("%4i mal %3i-Schein\n",anzahl_scheine[i],scheine[i]);
    }

    }

    Die Aufgabe ist einen Geldautomaten zu entwerfen. Der Geldautomat soll die Anzahl der Geldscheine anzeigen, die notwendig sind für einen bestimmten Betrag, den man in der Konsole eingibt. Das Programm macht das auch. Es gibt nur ein Problem. Die Aufgabenstellung lautet:

    Speichern()

    In dieser Funktion soll das, was in der Funktion Ausgabe() angezeigt wurde, in einer Textdatei gespeichert werden.

    Ich weiß nicht, wie man die Ausgabe aus der Funktion Ausgabe() in einer Textdatei speichert. Ich habe sehr viel probiert, bin leider nicht auf die richtige Lösung gekommen. Wenn jemand die richtige Lösung weiß, möge er bitte den richtigen Quellcode hochladen oder bitte zumindest erklären wie ich es machen muss.

    Vielen Dank



  • Zeig mal, was du probiert hast.

    Und nutze bitte die Code-Tags: Code mit der Maus markieren und unten auf den C-Button klicken.



  • Kennst du denn schon die Dateifunktionen fopen, fprintf, fclose etc.?

    PS: Ein paar Dinge könntest du noch abändern:
    - auch bei der Funktionsdefinition den Rückgabewert (hier 'int') angeben
    - niemals bei C direkt bei einem Datentyp auf die Anzahl Bytes schließen (außer sizeof(char) = 1), sondern auch hier sizeof benutzen:

    (sizeof(scheine)/sizeof(int))
    // oder
    (sizeof(scheine)/sizeof(scheine[0]))
    


  • Warum machst du so eine komplizierte Berechnung der Scheine?
    Division und Modulo (/ und 😵 kennst du doch (und benutzt es auch).



  • Erstmal danke für eure Antworten und Tipps. Ich werde es entsprechend in meinem Programm ändern. Das Problem ist, dass das Thema mit den Textdateien nicht in der Vorlesung vorgekommen ist, aber es Praktikum erwartet wird. Deshalb kenne ich die Begriffe fopen,fprintf und fscanf nicht. Ich habe im Skript des Professors vorausgeblättert, aber schlau wurde ich dadurch nicht.
    Trotzdem habe ich mir folgendes überlegt und probiert:

    oben nach #include habe ich ergänzt mit

    #include <stdlib.h>
    #include <string.h>
    

    Nach include <string.h> habe ich noch zwei #define Dateien eingefügt.

    #define FILENAME "geldautomat.txt"
    #define BUFFERLENGTH 20
    

    Dann habe ich nach int Ausgabe(void) die Funktion Speichern deklariert.

    int speichern(void);
    

    Ich bin mir nicht sicher, ob der Übergabetyp und int hier richtig sind.

    Nach der Funktion Ausgabe(void) habe ich eine Funktion int Speichern(void) eingefügt mit dem folgenden Quellcode:

    int Speichern(void)
    {
    	FILE *filepointer;
    	char buffer[BUFFERLENGTH];
    
    	if ( (filepointer = fopen (FILENAME,"r"))==NULL){
    		printf("Fehler beim oeffenen der Datei!\n");
    	}
    		fclose(filepointer);
    }
    

    Zuletzt folgt noch die geschweifte Klammer zu.
    Dies ist mein letzter Stand, was ich versucht habe. Falls ich einen Fehler gemacht habe, oder noch was ergänzen muss, dann korrigiert mich bitte.

    Vielen Dank für eure Antworten und Mühen



  • fopen (FILENAME,"r")
    

    so öffnest Du die Datei zum Lesen. Zum Schreiben musst Du

    fopen (FILENAME,"w")
    

    benutzen, siehe auch:
    http://www.cplusplus.com/reference/cstdio/fopen/
    Danach kannst Du dann mit fprintf in die Datei schreiben:
    http://www.cplusplus.com/reference/cstdio/fprintf/
    fprintf funktioniert wie printf mit einem zusätzlichen Parameter. Du musst fprintf als erstes den von fopen erhaltenen FILE - Pointer übergeben.



  • Vielen Dank für deine Hilfe Belli. Leider funktioniert es immer noch nicht mit der Textdatei. Alles andere funktioniert. Das Problem liegt, dass er die Textdatei nicht macht und schon gar nicht öffnet. Das Programm erkennt die Funktion Speichern nicht. Ich weiß nicht warum. Falls es jemand weiß woran es happert, dann bitte klärt mich auf.

    Vielen Dank



  • Paul9999 schrieb:

    Das Problem liegt, dass er die Textdatei nicht macht und schon gar nicht öffnet. Das Programm erkennt die Funktion Speichern nicht.

    Was denn nun?
    Gibt es Meldungen vom Compiler. Auch Warnungen sind wichtig.
    Oder gibt es eine Meldung vom Programm?

    Paul9999 schrieb:

    Falls es jemand weiß woran es happert, dann bitte klärt mich auf.

    Ohne aktuellem Code wird dir kaum einer helfen können.



  • Mein aktueller Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define FILENAME "geldautomat.txt"
    #define BUFFERLENGTH 20
    
    int scheine[7] = {500,200,100,50,20,10,5};
    int anzahl_scheine[7] = {0};
    
    int BetragEingeben(void);
    int AnzahlBerechnen(int, int);
    int Ausgabe(void);
    int Speichern(void);
    
    int main(void)
    {	
    	(void) AnzahlBerechnen(0,BetragEingeben());
    	Ausgabe();
    
    	return 0;
    }
    
    BetragEingeben(void)
    {
    	int betrag=0;
    	do
    	{	
    		printf("Bitte auszuzahlenden Betrag eingeben: ");
    		scanf("%i",&betrag);
    
    		if(betrag%5!=0)
    		{
    			printf("Es koennen nur ganze Euro-Noten ausgegeben werden!\n\n");
    		}
    
    	}
    	while(betrag%5!=0);
    
    	return betrag;
    }
    
    AnzahlBerechnen(int array_element, int betrag)
    {
    	int number_array_elements=(sizeof(scheine)/4);
    
    	if (betrag>=scheine[array_element])
    	{
    			betrag=betrag-scheine[array_element];
    			anzahl_scheine[array_element]=anzahl_scheine[array_element]+1;
    			AnzahlBerechnen(array_element,betrag);
    	}
    	else
    	{
    			if (betrag!=0)
    			{
    							AnzahlBerechnen(array_element+1,betrag); 
    			}
    			else
    			{
    				return betrag;
    			}
    	}
    
    }
    
    Ausgabe(void)
    {
    	int array_size=(sizeof(scheine)/4);
    	int i=0;
    
    	printf("\n\nAusgabe Banknoten:\n");
    
    	for (i=0; i<array_size; i++)
    	{
    		printf("%4i mal %3i-Schein\n",anzahl_scheine[i],scheine[i]);
    	}
    
    int Speichern(void)
    {
        FILE *filepointer;
        char buffer[BUFFERLENGTH];
    
        if ( (filepointer = fopen (FILENAME,"r"))==NULL)
    	{
            printf("Fehler beim oeffenen der Datei!\n");
        }
            fclose(filepointer);
    }
    
    }
    

    Das Programm lässt sich compilieren und zeigt die Anzahl der Scheine richtig an. Das Problem liegt immer noch in der Textdatei. Es konnte bisher keine Textdatei erstellt werden schon gar nicht geöffnet werden. Das was in der Funktion Ausgabe() angezeigt wurde, soll in einer Textdatei gespeichert werden, in einer Funktion Speichern(). Und da liegt das Problem.
    Ich hoffe, dass ich die Problemstellung verständlich erklärt habe. Falls noch irgendwas unklar sein sollte, einfach schreiben.

    Vielen Dank



  • Du hast ja gar nichts verändert. Lies dir nochmal (oder erstmalig) die Antwort von Belli von 13:41:27 durch.

    Außerdem schreibst du auch gar nichts in die Datei.
    Bei den Links von Belli sind auch Beispiele. Damit solltest du das schaffen.



  • Deine Funktion 'Speichern' sieht immer noch genau so aus, wie zuletzt: Du hast meine Hinweise ignoriert und die Funktion nicht entsprechend, bzw. überhaupt nicht geändert.

    Und: Du rufst die Funktion überhaupt nicht auf ...



  • Deine Funktion Speichern ist lokal zur Funktion Ausgabe definiert, sowas macht man nicht, und compiliert nur als Compiler-Extension.
    Achte auf die Compiler-Warnungen.
    Außerdem rufst du Speichern() nirgendwo auf.



  • Hallo nochmal,

    vielen Dank für eure Hilfe. Ich habe die richtige Lösung gefunden. Hier ist der Quellcode.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define FILENAME "geldautomat.txt"
    
    int scheine[7] = {500,200,100,50,20,10,5};
    int anzahl_scheine[7] = {0};
    
    int BetragEingeben(void);
    int AnzahlBerechnen(int, int);
    int Ausgabe(void);
    int Speichern(void);
    
    int main(void)
    {	
    	(void) AnzahlBerechnen(0,BetragEingeben());
    	Ausgabe();
    	Speichern();
    	return 0;
    }
    
    BetragEingeben(void)
    {
    	int betrag=0;
    	do
    	{	
    		printf("Bitte auszuzahlenden Betrag eingeben: ");
    		scanf("%i",&betrag);
    
    		if(betrag%5!=0)
    		{
    			printf("Es koennen nur ganze Euro-Noten ausgegeben werden!\n\n");
    		}
    
    	}
    	while(betrag%5!=0);
    
    	return betrag;
    }
    
    AnzahlBerechnen(int array_element, int betrag)
    {
    	int number_array_elements=(sizeof(scheine)/sizeof(int));
    
    	if (betrag>=scheine[array_element])
    	{
    			betrag=betrag-scheine[array_element];
    			anzahl_scheine[array_element]=anzahl_scheine[array_element]+1;
    			AnzahlBerechnen(array_element,betrag);
    	}
    	else
    	{
    			if (betrag!=0)
    			{
    							AnzahlBerechnen(array_element+1,betrag); 
    			}
    			else
    			{
    				return betrag;
    			}
    	}
    
    }
    
    Ausgabe(void)
    {
    	int array_size=(sizeof(scheine)/sizeof(int));
    	int i=0;
    
    	printf("\n\nAusgabe Banknoten:\n");
    
    	for (i=0; i<array_size; i++)
    	{
    		printf("%4i mal %3i-Schein\n",anzahl_scheine[i],scheine[i]);
    	}
    }
    
    int Speichern(void)
    {
    	FILE * filepointer;
    	int i;
    	int array_size=(sizeof(scheine)/sizeof(int));
    	char betrag[20];
        filepointer = fopen ("geldautomat.txt","w");
        for(i=0; i<array_size; i++)
        {
        	 fprintf (filepointer, "%4i mal %3i-Schein\n",anzahl_scheine[i],scheine[i]);
    	}
    
        fclose (filepointer);
    
    }
    

    Besonderen Dank geht an dich Belli. Es tut mir leid, falls ich euch verärgert habe. Ich muss deutlich besser aufpassen und ganz genau lesen, was ihr mir schreibt. Ich hoffe, dass ich es wiedergutmachen kann.

    Nochmals

    Vielen Dank an alle



  • Paul9999 schrieb:

    Ich muss deutlich besser aufpassen und ganz genau lesen, was ihr mir schreibt. Ich hoffe, dass ich es wiedergutmachen kann.

    Es gibt kaum etwas, was nicht mit einem Kasten Bier wiedergutgemacht werden kann. 😉



  • Paul9999 schrieb:

    Ich muss deutlich besser aufpassen und ganz genau lesen, was ihr mir schreibt.

    Das ist der Mist bei der ganzen Programmiererei 😉



  • Da hast du Recht, Belli.


Anmelden zum Antworten