fgets () funktioniert nicht nach fscanf ()

Ich benutze fscanf, um das Datum einzulesen und dann fgets, um die Notiz zu lesen. Nach der ersten Iteration gibt fscanf jedoch den Wert -1 zurück.

Ich habe GDB verwendet, um das Programm Schritt für Schritt zu debuggen. Es funktioniert einwandfrei bis zur ersten Verwendung von fgets. Wenn ich bei der ersten Iteration versuche, die von fgets gelesene Zeile auszudrucken, erhalte ich Folgendes:

(gdb) print line
$6 = "\rtest\r18/04/2010\rtest2\r03/05/2010\rtest3\r05/08/2009\rtest4\r\n\000\000\000\000q\352\261\a\370\366\377\267.N=\366\000\000\000\000\003\000\000\000\370xC\000\000\000\000\000\000\000\000\000\001\000\000\000\227\b\000\000\070\367\377\267H\364\377\267\362\202\004\bdoD\000\354\201\004\b\001\000\000\000\304oC\000p\363\377\277\260zC\000D\363\377\277\n!B\000\064\363\377\277\354\201\004\b(\363\377\277TzC\000\000\000\000\000\070\367\377\267\001\000\000\000\000\000\000\000\001\000\000\000\370xC\000\001\000\000\000\000\000\312\000\000\000\000\000\377\260\360\000\001\000\000\000\277\000\000\000\364\317\000\000\344\261\\\000\000\000\000\000p\363\377\277|\233\004\b\350\362\377\277 \204\004\b\005\000\000\000|\233\004\b\030\363\377\277"

Es sieht so aus, als würde fgets die verbleibenden Einträge lesen und sie dann alle in einer einzigen Zeichenfolge speichern.

Ich bin mir nicht sicher, warum das so ist.

Hier ist der Hauptcode:

int main(int argc, char* argv[]) {
    FILE* file;
    int numEntries, i = 0;
    int index = atoi(argv[1]);
    char line[SIZE];
    JournalEntry *entry;

    /*argument provided is the entry user wants to be displayed*/
    if (argc > 2) {
        perror("Error: Too many arguments provided");
    }
    file = fopen("journalentries.txt", "r");
    if (file == NULL) {
        perror("Error in opening file");
    }

    if (fscanf(file, "%d", &numEntries) != 1) {
        perror("Unable to read number of entries");
    }

    entry = (JournalEntry*)malloc(numEntries  * sizeof(JournalEntry));
    if (entry == NULL) {
        perror("Malloc failed");
    }

    for (i = 0; i < numEntries; i++) {
        if (fscanf(file, "%d/%d/%d", &entry[i].day, &entry[i].month, &entry[i].year) != 3) {
            perror("Unable to read date of entry");
        }

        if (fgets(line, sizeof(line), file) == NULL) {
            perror("Unable to read text of entry");
        }
    }

    printf("%d-%02d-%02d %s: ", entry[index].year, entry[index].month, entry[index].day, entry[index].text);

    if(ferror(file)) {
        perror("Error with file");
    }

    fclose(file);
    free(entry);

    return 0;
}

Die Datei, die ich lesen muss: Die allererste Zeile enthält die Anzahl der zu lesenden Einträge

4
12/04/2010
test
18/04/2010
test2
03/05/2010
test3
05/08/2009
test4

Die Struktur JournalEntry in der Header-Datei:

typedef struct {
    int day;
    int month;
    int year;
    char text[250];
} JournalEntry;

Antworten auf die Frage(3)

Ihre Antwort auf die Frage