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.
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;
}