ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
1100
1100
EMPFEHLEN
-
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.
Code c:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
#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.
-
Danke für die Antwort, ich habe deinen Rat befolgt und es klappt jetzt alles.
Ähnliche Themen
-
[C++]ReadProcessMemory Problem beim vergleichen von Werten an bestimmter Adresse.
Von Maila im Forum C/C++Antworten: 0Letzter Beitrag: 04.12.10, 15:45 -
Problem bei MSSQL->MySQL mit NULL-Werten (über CSV-Datei)
Von Micro-User im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 31.07.09, 14:58 -
Probleme beim einlesen mit fscanf
Von Assanur im Forum C/C++Antworten: 7Letzter Beitrag: 27.10.08, 11:56 -
Textdatei einlesen und in Struktur ablegen, fgets fscanf oder strtok?
Von tromtom im Forum C/C++Antworten: 5Letzter Beitrag: 13.04.08, 17:04 -
fscanf/fgets oder doch was anderes?
Von meberhard im Forum C/C++Antworten: 1Letzter Beitrag: 11.12.07, 17:20





Zitieren
Login






