Problem beim Laden von Werten aus Datei mit fgets und fscanf in while-schleife

xbugsx

Grünschnabel
Hallo!!

Ich möchte gerne einen String und einen Integer Wert in eine Datei ablegen und den String mit fgets und den Integerwert mit fscanf auslesen. Die Struktur habe ich von 4 Strings auf 1 und die Integervariabeln von 3 auf 1 gekürzt, um die Schreibarbeit zu verringern. Man hat im Menü 4 Optionen. 1) Eingeben von Werten, 2) Ausgeben der Werte, 3) Speichern der Werte in eine Datei, 4) Laden der Werte aus einer Datei und 9) das Beenden des Programmes. Eigentlich funktioniert alles. Ich kann viele Werte eingeben und sie werden mir auch aus der Liste richtig ausgegeben. Nur wenn ich die Werte aus der Datei lade, gibt es Probleme mit fgets und fscanf. Wenn ich die Variable char ean[14] aus dem Programm entferne oder als Kommentar benutze, funktioniert alles, sowie, wenn ich int rtime herausnehme. Ich glaube es liegt daran, dass fgets und fscanf in der While-Schleife zusammen sind und dadurch eine Bedienung nicht richtig von mir geschrieben wurde.
Ich würde mich über Hilfe freuen.
Denn alle Integervariabeln in Chars umzuändern möchte ich nicht gerne, wozu hat man denn die Integervariable.

C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DATEI "movies.txt"

struct movie {                      /*Struktur mit nur noch 2 Variablen*/
	char ean[14];
	int rtime;
	struct movie *next;
};

struct movie *next = NULL;
struct movie *start = NULL;

void append(char *ean, int rtime) {          //Append erstellt die Liste oder hängt neue 
	struct movie *pointer;                    //Filme an
	
	if(start == NULL) {
		if((start = (struct movie *)malloc(sizeof(struct movie))) == NULL) {
			fprintf(stderr, "Kein Speicherplatz vorhanden für start\n");
			return;
		}
		strcpy(start->ean, ean);
		start->rtime = rtime;
		start->next = NULL;
	}
	else {
		pointer = start;
		while(pointer->next != NULL) {
			pointer = pointer->next;
		}
		if((pointer->next = (struct movie*)malloc(sizeof(struct movie))) == NULL) {
			fprintf(stderr,"Kein Speicherplatz für das letzte Element\n");
			return;
		}
		pointer=pointer->next;
		strcpy(pointer->ean, ean);
		pointer->rtime = rtime;
		pointer->next = NULL;
	}
	printf("EAN in Append: %s\n", ean);
}

int exist(char *ean) {                           //In dieser Funktion wird überprüft ob der 
	struct movie *pointer;                 // Film schon vorhanden ist
	
	if(start != NULL) {
		pointer = start;
		while(pointer != NULL) {
			if(strcmp(ean, pointer->ean) == 0) {
				printf("Film schon vorhanden\n");
				return 1;
			}
			pointer = pointer->next;
		}
	}
	return 0;
}

void output(void) {                           //Mit dieser Funktion wird die gesamte Liste 
	int i = 1;                                 //ausgeben
	struct movie *pointer = start;
	printf("**************************\n");
	printf("EAN\t|\tSpielzeit\t|\n");
	printf("--------------------------\n");
	while( pointer != NULL) {
		printf("%-3s\t|\t%-10d\t|\n", pointer->ean, pointer->rtime);
		pointer = pointer->next;
		i++;
	}
	printf("**************************\n");
}

void input(void) {                                //In dieser Funktion werden die Infos eines
	char ean[14], *ptr;                      // Films abgefragt und an Append()
	int rtime;                                   // weitergegeben
		
	printf("EAN-Nummer.........: ");
	fgets(ean, sizeof(ean), stdin);
	ptr = strrchr(ean, '\n');
   *ptr = '\0';
	if(exist(ean) == 1) {
		return;
	}
	printf("Spielzeit (in min.): ");
	scanf("%d",&rtime);
	append(ean,rtime);
}

void save(void) {                             //In dieser Funktion wird die gesamte
	FILE *fp;                                // Liste gespeichert
	struct movie *pointer;
	
	if(start == NULL) {
		printf("Es sind noch keine Filme angelegt worden\n");
	}
	else {
		if((fp = fopen(DATEI, "w")) == NULL) {
			printf("Fehler beim Öffnen der Datei\n");
			return;
		}
		if((pointer = (struct movie *)malloc(sizeof(struct movie))) == NULL) {
				fprintf(stderr, "Kein Speicherplatz vorhanden für start\n");
				return;
		}
		pointer = start;
		do {
			fprintf(fp, "%s\n", pointer->ean);
			fprintf(fp, "%d\n", pointer->rtime);
			pointer = pointer->next;
		}while(pointer != NULL);
		fclose(fp);
	}
}

void load(void) {                      //Das ist die Problemfunktion, die die Daten aus der
	FILE *fp;                        // Datei lädt, nur ean mit fgets geht oder rtime mit
	char ean[14],*ptr;            //fscanf auch
	int rtime;
		
	if((fp = fopen(DATEI, "r")) == NULL) {
		printf("Es wurden noch keine Filme angelegt\n");
		return;
	}
	else {            // es wird so lange ausgelesen bis fgets == NULL !!und "fscanf == 0"?
		while(fgets(ean, sizeof(ean),fp) != NULL && fscanf(fp, "%d", &rtime) == 1 ) {
			ptr = strrchr(ean, '\n');
			*ptr = '\0';
			append(ean,rtime);
		}
		fclose(fp);
	}
}

void quit(void) {                      // Hier wird nochmal nachgefragt ob man die Liste
	char quit;                       // nochmal speichern möchte, bevor das Programm
	                                    // beendet wird
	if(start != NULL) {
		do {
			printf("Möchten Sie die Liste speichern? [y/n]: ");
			scanf("%c",&quit);
			if(quit == 'y') {
				save();
				return;
			}
			else if(quit != 'n')
				printf("Falsche Eingabe\n");
		}while(quit != 'n');
	}
}
	
int main (int argc, const char * argv[]) {          //Die Hauptfunktion
	int wahl;
	do {
		printf("\n1 : Eingabe\n");
		printf("2 : Ausgabe\n");
		printf("3 : Speichern\n");
		printf("4 : Laden\n");
		printf("9 : Ende\n");
		printf("Ihre Wahl : ");
		scanf("%d",&wahl);
		getchar();
		switch(wahl) {
			case 1 :	input();
						break;
			case 2 :	output();
						break;
			case 3 :	save();
						break;
			case 4 :	load();
						break;
			case 9 :	quit();
						break;
			default:	printf("Falsche Eingabe\n");
		}
	} while(wahl != 9);
	return 0;
}
 
Du machst das viel zu umständlich ;).

Schreib doch einfach per fwrite die Struktur direkt in die Datei, und les sie später dann wieder mit fwrite ein.
 

Neue Beiträge

Zurück