C Daten aus Datei in struct einlesen

PepTic

Newbie
Registriert
Jan. 2014
Beiträge
4
Hallo erstmal!

Habe ein kleines Kontoprogramm geschrieben.
Das Speichern in die Datei klappt schon, nun möchte ich, dass ich zu Beginn des Programms auf den Inhalt der Datei zugreifen und ihn verwenden kann.

Außerdem wäre es nett, wenn sich jemand mal den Code anschaut, ob Fehler, oder Verbesserungen vorhanden sind.

Der Compiler zeigt bis auf Rückgabewertfehler bei scanf und getch keine Fehler.

main.c
Code:
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "konto.h" 
#include <conio.h>

int main(void) 
{ 
    int auswahl = 0; 
	int IDZaehler = 100; 
	int kontoID = 0;
	int kontoID2 = 0;
    double betrag = 0; 
    
	do
    { 
		printf("-----------------------------------KONTOFUEHRUNG--------------------------------\n");
		printf("Herzlich Willkommen \n");
		printf("------------------- \n\n");
        printf("1) Konto erstellen\n"); 
        printf("2) Konto anzeigen\n"); 
        printf("3) Konto loeschen\n"); 
        printf("4) Ueberweisung\n"); 
		printf("5) Speichern\n");
        printf("0) Beenden\n\n"); 
		printf("------------------- \n");
        printf("Auswahl: "); 
		scanf("%d", &auswahl);
		fflush(stdin);
		
		switch(auswahl) 
        { 
            case 0: 
				exit(1);
			case 1: 
                erstelle_konto(IDZaehler); 
                IDZaehler++; 
                break; 
            case 2: 
                printf("Geben sie die Kontonummer ein: "); 
				scanf("%d", &kontoID); 
				fflush(stdin);
                zeige_konto(kontoID); 
                break; 
            case 3: 
                printf("Geben sie die Kontonummer ein: "); 
				scanf("%d", &kontoID); 
				fflush(stdin);
                loesche_konto(kontoID); 
                break; 
            case 4: 
                printf("Geben sie die Kontonummer ein, von der abgebucht werden soll: "); 
				scanf("%d", &kontoID); 
				fflush(stdin);
                printf("Geben sie die Kontonummer ein, an die ueberwiesen werden soll: "); 
				scanf("%d", &kontoID2); 
				fflush(stdin);
                printf("Geben sie den Betrag ein, der ueberwiesen werden soll: "); 
				scanf("%lf", &betrag); 
				fflush(stdin);
                ueberweisung(kontoID, kontoID2, betrag); 
                break; 
			case 5:
				printf("Geben sie die Kontonummer ein: "); 
                scanf("%d", &kontoID);
				fflush(stdin);
				speichere_konto(kontoID);
				break;
            default: 
                break; 
        } 
		printf("Druecken Sie eine beliebige Taste um vorzufahren");
		getch();
		system("cls");
    } 
	while(auswahl);
	return 1;
}

int erstelle_konto(int ID) 
{ 
	printf("\n\nVorname:     "); 
	scanf("%s", konten[ID].vorname); 
	fflush(stdin);
    printf("Nachname:    "); 
	scanf("%s", konten[ID].nachname); 
	fflush(stdin);
    printf("Kontostand:  "); 
	scanf("%lf", &konten[ID].kontostand); 
	fflush(stdin);
    printf("Kontonummer: %d\n", ID); 
	konten[ID].kontonummer = ID;
    printf("Konto wurde erstellt!\n\n\n"); 
	return 0;
} 

void loesche_konto(int ID) //man kann nichtvorhandene konten löschen
{ 
    if((strlen(konten[ID].vorname) == 0 ) || ( strlen(konten[ID].nachname) == 0)) 
	{ 
        printf("\n\nDieses Konto existiert nicht!\n\n\n"); 
    } 
	else
	{
		strcpy(konten[ID].vorname, ""); 
		strcpy(konten[ID].nachname, ""); 
		konten[ID].kontostand = 0;
		printf("Konto wurde geloescht\n");
	}
} 

void zeige_konto(int ID) 
{ 
    if((strlen(konten[ID].vorname) == 0 ) || ( strlen(konten[ID].nachname) == 0)) 
	{ 
        printf("\n\nDieses Konto existiert nicht!\n\n\n"); 
    } 
    else 
    { 
        printf("\n\nVorname:     %s\n", konten[ID].vorname); 
        printf("Nachname:    %s\n", konten[ID].nachname); 
        printf("Kontostand:  %.2lf\n", konten[ID].kontostand); 
        printf("Kontonummer: %d\n\n\n", konten[ID].kontonummer); 
    } 
} 

void speichere_konto(int ID) 
{ 
	if((strlen(konten[ID].vorname) == 0 ) || ( strlen(konten[ID].nachname) == 0)) 
	{ 
        printf("\n\nDieses Konto existiert nicht!\n\n\n"); 
    } 
	else
	{
		FILE *datei; 
		datei = fopen("Konten.txt", "a+"); 
	
		if(datei == NULL)
		{
			printf("\nFEHLER BEIM SPEICHERN"); 
			return;
		}

		else
		{
			fprintf(datei, "Kontonummer: %d\nVorname:     %s\nNachname:    %s\nKontostand:  %.2f\n\n", konten[ID].kontonummer, konten[ID].vorname, konten[ID].nachname, konten[ID].kontostand); 
		}
		fclose(datei); 
		printf("Konto wurde gespeichert!\n\n\n");
	}
} 

void ueberweisung(int vonID, int zuID, double betrag) 
{ 
    if((konten[vonID].kontostand - betrag) < 0) 
    { 
        printf("\n\nNicht genug Guthaben!\n\n\n"); 
    } 
    else 
    { 
        konten[vonID].kontostand = konten[vonID].kontostand - betrag; 
        konten[zuID].kontostand = konten[zuID].kontostand + betrag; 
        printf("\n\nUeberweisung erfolgreich!\n\n"); 
    } 
}
konto.h
Code:
struct konto
{ 
    char vorname[20]; 
    char nachname[20]; 
    double kontostand; 
    int kontonummer; 
}
konten[1000];

typedef struct konto konto;

int erstelle_konto(int); 
void loesche_konto(int); 
void zeige_konto(int); 
void speichere_konto(int);
void ueberweisung(int, int, double);

Schonmal vielen Dank für eure Hilfe!
 
Aktivier' mal alle Warnungen für deinen Compiler (für gcc z.B. -Wall -Wextra). Da kommen vielleicht noch ein paar Hinweise.

fflush(stdin) ist undefiniertes Verhalten.
 
Zuletzt bearbeitet:
PepTic schrieb:
Dachte das muss so bei scanf()?
Nein, leider nicht. Ich versteh' dein Anliegen aber so funktioniert's leider nicht (Wobei ich glaube, dass es bei Windows durchaus "funktioniert". Weiß ich aber nicht genau). Normalerweise musst du den Eingabepuffer mehr oder minder konsumieren. Wenn uninteressante Dinge dabei sind, werden sie halt verworfen. Scanf() ist prinzipiell nicht sonderlich gut dafür geeignet. Vielleicht sind fgets() und sscanf() die bessere Wahl für dich?
Ansonsten würde ich die Funktionen in eine konto.c packen und überall sichere Varianten der Funktionen verwenden (z.B. strncpy(), scanf("%20s")).
 
Hab es nun einfach entfernt, dann ist's halt so.

Nun hab ich noch das Problem mit dem Zugriff auf die Daten in der Datei.:confused_alt:
 
Code:
int main(void)
{
    int auswahl = 0;
	int IDZaehler = 100;
	int kontoID = 0;
	int kontoID2 = 0;
    double betrag = 0;

	do
    {
		oeffne_konto(kontoID);
		printf("-----------------------------------KONTOFUEHRUNG--------------------------------\n");...
Code:
int oeffne_konto(int ID)
{
	char tmpKontonummer[7];
	char tmpKontostand[20];
	char tmpVorname[20];
	char tmpNachname[20];

	
	int kontonummer;
	int kontostand;
	int zeichen;
	int position=0;
	int trennzeichen=0;
	FILE *datei;

	datei = fopen("konten.txt", "r");

	if(datei != NULL)
	{
		zeichen=fgetc(datei);
		
		while(!feof(datei))
		{
			if(zeichen == ';')
			{
				position=0;
				trennzeichen++;
			}
			else
			{
				switch(trennzeichen)
				{
					case 0: 
						tmpKontonummer[position] = zeichen;
						break;
					case 1: 
						tmpVorname[position] = zeichen;
						tmpVorname[position+1] = '\0'; 
						break;
					case 2: 
						tmpNachname[position] = zeichen;
						tmpNachname[position+1] = '\0'; 
						break;
					case 3:	
						tmpKontostand[position] = zeichen;
						break;
					default:
						break;
				}
				position++;
			}
			zeichen=fgetc(datei);
		}
		
		fclose(datei);

		
		kontonummer = atoi(tmpKontonummer);
		kontostand = atof(tmpKontostand);

		strcpy(konten[ID].vorname, tmpVorname);
		strcpy(konten[ID].nachname, tmpNachname);
		konten[ID].kontonummer = kontonummer;
		konten[ID].kontostand = kontostand;

		return 1;
	}

	else
	{
		return 0;
	}
}

soweit bin ich nun, funktioniert aber nicht.
 
Zurück
Oben