Zeiger auf Struktur



  • Hallo,

    im Unterricht behandeln wir zur Zeit das Thema "Zeiger auf Strukturen".
    Die aktuelle Aufgabe dazu lautet, ein Verwaltung für Kontodaten zu schreiben.

    Ich habe in einer .txt Datei Kontodaten, in der Form Kontonummer-Inhaber-Kontostand, gespeichert.

    Nun soll mit Hilfe den Unterprogrammen "ausgabeListe" und "ausgabeKonto" eine List der gespeicherten Konten ausgegeben werden.
    "ausgabeListe" übergibt die Daten vom .txt File an das Unterprogramm "ausgabeKonto" und dieses übernimmt dann die tatsächliche Ausgabe auf den Bildschrim.

    Soweit so gut, doch bei mir wird leider nur ein Konto ausgegeben und nicht die gesamte Liste. 😞
    Hier der Code von den Unterprogrammen und der Struktur.

    struct Konto
    {
    	int nr;
    	char name[30];
    	double stand;
    };
    
    void ausgabeListe(Konto *pkonto)
    {
    	FILE *fp;
    	char buffer[100];
    
    	fp = fopen("E:\\konto2.txt", "r");
    
    	while(!feof(fp))
    	{	
            fgets(buffer,100,fp);
    		sscanf(buffer, "%i %s %lf ", &pkonto->nr, pkonto->name, &pkonto->stand);
    		ausgabeKonto(pkonto);
    	}
    	fclose(fp);
    }
    
    void ausgabeKonto(Konto *pkonto)
    {
    	printf("\nKontonummer: %i",(*pkonto).nr);
    	printf("\nName: %s",(*pkonto).name);
    	printf("\nKontostand: %lf",(*pkonto).stand);
    }
    
    pkonto->nr
    

    bedeutet so viel wie

    (*pkonto).nr
    

    ... 😃

    Gut möglich das einige ForumUser beim Durchlesen dieses Codes nur den Kopf schütteln werden, aber ich glaube unser Lehrer programmiert nach dem OldSchool-Style. 😉

    Das Thema Zeiger ist für mich ehrlich gesagt ein bisschen verwirrend, vorallem mit diesem Lehrer. 😞

    Da eine ähnliche Aufgabe morgen zur Klausur kommen wird, hoffe ich das sich doch noch jemand von euch erbarmt und mir weiterhilft. Aber an einem sonnigen, schönen Sonntag wie heute, werde ich euch das natürlich nicht verübeln.

    Viele Grüße,
    Philipp



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,
    gib doch bitte mal nen Testdatensatz aus der Datei.

    Denn bei mir funktionierts:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Konto
    {
        int nr;
        char name[30];
        double stand;
    };
    
    void ausgabeListe(struct Konto *pkonto);
    void ausgabeKonto(struct Konto *pkonto2);
    
    int main()
    {
    	struct Konto myK;
    	ausgabeListe(&myK);
    	return 0;
    }
    
    void ausgabeListe(struct Konto *pkonto)
    {
        FILE *fp;
        char buffer[100];
    
        fp = fopen("C:\\konto.txt", "r");
    
        while(!feof(fp))
        {
            fgets(buffer,100,fp);
            sscanf(buffer, "%d %s %lf ", &pkonto->nr, pkonto->name, &pkonto->stand);
            ausgabeKonto(pkonto);
        }
        fclose(fp);
    }
    
    void ausgabeKonto(struct Konto *pkonto2)
    {
        printf("Kontonummer: %d ", pkonto2->nr );
        printf("Name: %s ", pkonto2->name);
        printf("Kontostand: %lf \n ", pkonto2->stand);
    }
    

    Ausgabe:

    Kontonummer: 123 Name: Ich Kontostand: 500.000000
    Kontonummer: 124 Name: Du Kontostand: 600.000000

    Process returned 0 (0x0) execution time : 0.046 s
    Press any key to continue.



  • Vielen Dank für Deine Antwort! 🙂

    Ich erhalte bei deinem Code zwar keine Errors, aber sobald ich das Programm starte , wird es auch schon wieder geschlossen - mit der Meldung: "floating points format not linked" 😕 Was kann das sein?

    Hier noch der gesamte Code zu diesem Programm. Bitte nicht wundern, aber in dieser Version haben die Unterprogramme noch andere Namen. 🕶
    Wie ich sehe habe ich ja keine gröberen Fehler gemacht, also ist das dann einfach nur ein kleiner Bug vom Borland?

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    
    struct Konto
    {
    	int nr;
    	char name[30];
    	double stand;
    };
    
    void eingabe(Konto *pk);
    void zahlEin(Konto *pk);
    void getStand(Konto *pk);
    void ausgabe(Konto *pk);
    void menu();
    void save(Konto konto);
    //void load(Konto *pkonto);
    void ausgabeFILE(Konto *pkonto);
    
    void main()
    {
    	 Konto konto;
    
    	 char antwort=0;
    	 clrscr();
    
    	 while(antwort!='b')
    	 {
    			menu();
    			antwort = getche();
    
    			switch(antwort)
    			{	case 'e': eingabe(&konto); break;
    				case 'a': ausgabeFILE(&konto); break;
    				case 'z': zahlEin(&konto); break;
    				case 'd': getStand(&konto); break;
    				case 's': save(konto); break;
    				//case 'l': load(&konto); break;
    				case 'b': break;
    			}
    	}
    
    }
    
    void menu()
    {
    	printf("\n\nAuswahl:");
    	printf("\nEingabe ....... e");
    	printf("\nKontoauszug ... a");
    	printf("\nEinzahlung .... z");
    	printf("\nKontostand .... d");
    	printf("\nspeichern ..... s");
    	//printf("\nladen ......... l");
    	printf("\nbeenden ....... b\t");
    }
    
    void eingabe(Konto *pk)
    {
    	printf("\n\nEingabe:");
    	printf("\nKontonummer: ");
    	scanf("%d",&(*pk).nr);
    	printf("Name: ");
    	scanf("%s",(*pk).name);
    	(*pk).stand = 0;
    }
    
    void ausgabe(Konto *pk)
    {
    	printf("\n\nLISTE");
    	printf("\nKontonummer: %i",(*pk).nr);
    	printf("\nName: %s",(*pk).name);
    	printf("\nKontostand: %lf",(*pk).stand);
    }
    
    void ausgabeFILE(Konto *pkonto)
    {
    	FILE *fp;
    	char buffer[100];
    	//Konto konto;
    
    	fp = fopen("E:\\konto2.txt", "r");
    	while(!feof(fp))
    	{	fgets(buffer,100,fp);
    		sscanf(buffer, "%i %s %lf ", &pkonto->nr, pkonto->name, &pkonto->stand);
    		ausgabe(pkonto);
    	}
    	fclose(fp);
    }
    
    void zahlEin(Konto *pk)
    {
       double betrag=0;
    
    	printf("\n\nEinzahlung:");
    	printf("\nBetrag: ");
    	scanf("%lf",&betrag);
    	(*pk).stand += betrag;
    }
    
    void getStand(Konto *pk)
    {
    	printf("\n\nKontostand: %lf",(*pk).stand);
    }
    
    void save(Konto konto)
    {
    	FILE *fp;
    	char buffer[100];
    
    	fp = fopen("E:\\konto2.txt", "a");
    	sprintf(buffer, "%i %s %lf ", konto.nr, konto.name, konto.stand);
    	fputs(buffer, fp);
    	fclose(fp);
    }
    
    /*void load(Konto *konto)
    {
    	FILE *fp;
    	char buffer[100];
    
    	fp = fopen("E:\\konto.txt", "r");
    	fgets(buffer,100,fp);
    	sscanf(buffer, "%i %s %lf", &konto->nr, konto->name, &konto->stand);
    	fclose(fp);
    }*/
    


  • Philippi schrieb:

    Vielen Dank für Deine Antwort! 🙂

    Ich erhalte bei deinem Code zwar keine Errors, aber sobald ich das Programm starte , wird es auch schon wieder geschlossen - mit der Meldung: "floating points format not linked" 😕 Was kann das sein?

    Das ist dein böser Borland Compiler 😉
    http://c-faq.com/fp/fpnotlinked.html

    Ich habe als IDE Code::Blocks und als Compiler den mingw-gcc 🙂

    Philippi schrieb:

    Wie ich sehe habe ich ja keine gröberen Fehler gemacht, also ist das dann einfach nur ein kleiner Bug vom Borland?

    Das kann ich dir leider nicht beantworten, da du wieder die Test-Datei nicht mitgepostet hast. Von der Logik her ist das Programm i.O., aber wir sollten trotzdem nochmal deine Testdatei anschauen, damit da vielleich nicht etwas im argen liegt.

    Btw. schreib doch bitte "struct" in deine Prototypen und Funktionen mit rein 🙂

    Und im main() mach ma bitte aus "Konto konto;" -> "struct Konto myK" und arbeite dann mit myK weiter.
    Ich kann dir aber nicht sagen ob das vielleicht was damit zu tun hat.
    Der gcc lässt nämlich die Struktableitung ohne "struct" gar nicht zu. Warum der Borland das macht... keine Ahnung 😮



  • codefrag schrieb:

    Der gcc lässt nämlich die Struktableitung ohne "struct" gar nicht zu. Warum der Borland das macht... keine Ahnung 😮

    weil der borland den code wahrscheinlich als 'c++' compiliert und deshalb ist auch mit überraschungen rechnen.
    benenn' dein sourcefile in '.c' um, dann springt auch der C-compiler an...
    🙂


Anmelden zum Antworten