2016-07-30 44 views
1

ich ein Datenformat wie das folgende haben:fscanf Formatbezeichner in structs

22/March/2014 
137 8 
15 16 34 8 18 
17/November/2014 
106 8 
22 29 30 9 6 
20/November/2014 
169 10 
50 58 38 29 1 

Ich versuche, sie in die folgende Struktur zu verwenden fscanf, um den Inhalt der Datei zu erhalten und Ort:

struct date{ 

    //This is storing the date dd/month/yyyy. 
    char* fullDate; 

    // Number of foot and wheelchair passengers. 
    int foot; 
    int wheelchair; 

    //number of infant, child, adult, senior and family tickets sold 
    int infant; 
    int child; 
    int adult; 
    int senior; 
    int family; 
}; 

Also habe ich versucht, die folgenden:

struct date r[50]; 
    FILE* der = fopen("C:\\Users\\Def\\Downloads\\annual_sales_data_2014.txt","r"); 
    int i = 0; 
    rewind(der); 
    fscanf(der, "%s", r[i].fullDate); 
    fscanf(der, "%d %d ", &r[i].foot, &r[i].wheelchair); 
    fscanf(der, "%d %d %d %d",&r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family); 
    printf("%s\n%d %d\n%d %d %d %d %d\n\n", r[i].fullDate, r[i].foot, r[i].wheelchair, r[i].infant, r[i].child, r[i].adult, r[i].senior, r[i].family); 

    fclose(der); 

Aber ich glaube, dass fscanf nicht richtig benutzt wird und ich bin ein immer Etwas verwirrt von der Dokumentation für Formatbezeichner, habe ich es auch so probiert.

fscanf(der, "%s/%s/%s\n%d %d\n%d %d %d %d %d\n", r[i].day, r[i].month, , r[i].year, &r[i].foot, &r[i].wheelchair, &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family); 

Im obigen Beispiel auch die Struktur i Verpflegung 3 Zeichen zu akzeptieren * 's für den Tag Monat und Jahr. am Anfang der Formatbezeichner Zeichenfolge. Das hat auch nicht funktioniert, also habe ich es auf ein kleineres Format heruntergebrochen, um zu sehen, ob ich das Problem diagnostizieren könnte.

Selbst im aufgeschlüsselt Beispiel dieses

fscanf(der, "%s", r[i].fullDate); 

sogar bricht dies im Debugger und kippe Arbeit heraus, warum.

Danke.

+0

Wenn 'Sie in eine Variable fscanf', sollten Sie geben es ist Adresse. –

+0

'r [i] .fullDate' zeigt nicht auf einen bestimmten Speicherpuffer, der Daten empfangen kann, aber Sie übergeben seinen undefinierten Wert als evangelium an' fscanf' für die Population. Ihr Code ruft undefiniertes Verhalten auf. – WhozCraig

+0

Beim ersten Versuch benötigt das letzte 'scanf()' noch ein '% d'. Ansonsten sollte es funktionieren, außer dass Sie zuerst Speicher für das 'fullDate'-Member jeder Struktur zuweisen müssen (und eine '% s'-Angabe hinzufügen sollten, um Überläufe zu vermeiden). – Dmitri

Antwort

1

Sie können das Datum nicht mit fscanf(der, "%s", r[i].fullDate); analysieren, da fulldate ein nicht initialisierter Zeiger ist. Sie sollten die Adresse eines Arrays für das Format %s übergeben. Setzen Sie ein Array in der Struktur anstelle eines Zeigers, wie char fullDate[30]; und fscanf(der, "%29s", r[i].fullDate);

Hinweis verwenden, dass Sie die aktuellen Komponenten analysieren kann direkt mit:

char monthName[16]; 
int day, year; 

if (fscanf("%d/%15[^ /]/%d", &day, monthName, &year) == 3) { 
    /* Date parsed correctly */ 
} else { 
    /* At least one field missing, bail out */ 
    exit(1); 
} 
+0

Vielen Dank für Ihre Antwort, sie sind alle dankbar :) Dieser Typ traf den Nagel auf den Kopf, beantwortete sogar eine Frage, die ich eigentlich fragen sollte, aber vergessen: D. Jetzt weiß ich, wie man das Datum analysiert, danke :) – Definity

1

fullDate muss vor der Verwendung initialisiert werden. Der einfachste Weg ist:

r[i].fullDate = malloc(whatever_size_you_need); 

oder Sie können es sogar als ein Array deklarieren zusätzliche Initialisierung zu vermeiden:

struct date{ 

    //This is storing the date dd/month/yyyy. 
    char fullDate[proper_size]; 

    // ... 
}; 

Natürlich müssen Sie sicherstellen, dass irgendwie Lese String in den Puffer passen.

0

Sie sagen, Sie glauben, dass fscanf wird nicht richtig verwendet, und das ist richtig. Diese Linie

fscanf(der, "%d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family); 

ist vorbei Argumente für die 5 Felder, die Sie füllen möchten, aber es hat nur 4-Format Formatbezeich. Versuchen Sie folgendes:

fscanf(der, "%d %d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family); 

Darüber hinaus sollten Sie immer überprüfen, ob die Datenfelder richtig gelesen wurden. Der Rückgabewert von fscanf hätte Ihnen gesagt, dass nur 4 Artikel gelesen wurden.