tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
1100
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    xbugsx xbugsx ist offline Mitglied
    Registriert seit
    Mar 2004
    Beiträge
    11
    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;
    }
     

  2. #2
    Teambeta Teambeta ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    207
    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.
     

  3. #3
    xbugsx xbugsx ist offline Mitglied
    Registriert seit
    Mar 2004
    Beiträge
    11
    Danke für die Antwort, ich habe deinen Rat befolgt und es klappt jetzt alles.
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 04.12.10, 15:45
  2. Problem bei MSSQL->MySQL mit NULL-Werten (über CSV-Datei)
    Von Micro-User im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 31.07.09, 14:58
  3. Probleme beim einlesen mit fscanf
    Von Assanur im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 27.10.08, 11:56
  4. Antworten: 5
    Letzter Beitrag: 13.04.08, 17:04
  5. fscanf/fgets oder doch was anderes?
    Von meberhard im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 11.12.07, 17:20