2016-07-17 10 views
1

Ich arbeite an einer Zuweisung für eine Klasse und ich habe Probleme beim Anwenden von Dateieingabe/-ausgabe und Strukturen zusammen. Ich habe diesen Code, der verschiedene Autos aus einer Datei liest und ihre Informationen in ein Array von Strukturen kopiert.C Programm: Lesen von Datei und Kopieren in eine Struktur?

#include <stdio.h> 

#define MAX_LEN 1000 
#define NAME_LEN 30 

struct car{ 
    char make[NAME_LEN + 1]; 
    char model[NAME_LEN + 1]; 
    int year; 
    int cmpg; 
    int hmpg; 
    int avgmpg; 
}; 
. 
. 
. 
int main() 
{ 
    int i; 

    struct car cars[MAX_LEN]; 

    FILE* pFile; 
    pFile = fopen("cars.txt", "r"); 

    . 
    . 
    . 
    . 

    for(i = 0; i < MAX_LEN; i++) 
    { 
     while(!feof(pFile) && !ferror(pFile)) 
      { 
      fscanf(pFile, "%s%s%d%d%d ", cars[i].make, cars[i].model, &cars[i].year, &cars[i].cmpg, &cars[i].hmpg); 
      cars[i].avgmpg = (cars[i].cmpg + cars[i].hmpg)/2; 
     } 
    } 

    selection_sort(cars, MAX_LEN); 

    FILE* outFile; 
    outFile = fopen("sorted_cars.txt", "w"); 

    fprintf(outFile, "Make  Model year city mpg highway mpg average mpg\n"); 

    for(i = 0; i < MAX_LEN; i++); 
    { 
     fprintf(outFile, "%s %s %d %-2d %-10d %-12d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 
     printf("%s %s %d %d %d %d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 
    } 


    fclose(pFile); 
    fclose(outFile); 
    return 0; 
    } 

Dies ist, was die TXT-Datei wie folgt aussieht:

Mercury Sable 2009 18 28 
Jeep Wrangler 2016 17 21 
Honda Civic 2015 31 41 
Toyota Corolla 2015 30 42 
Toyota Prius 2010 51 48 
Ford Escape 2013 23 33 
Ford Fusion 2013 25 37 
Acura MDX 2014 20 28 
Lexus RX 2013 32 28 

ich eine Druckfunktion in meinen Code eingefügt, so konnte ich sehen, ob die Autos richtig gelesen, aber wenn ich das Programm ausführen, um dieses der Ausgang ist:

▒▒▒8 0 0 1465899048 32767

ich habe absolut keine Ahnung, warum dies geschieht. Kann jemand helfen?

+0

'Materie for (i = 0; i MAX_LEN <; i ++) { while (feof (pFile) && ferror (! pFile)) ':' while' -> 'if (3! = fscanf (pFile, ...)) break;' – BLUEPIXY

+0

Ich vermute, dass Ihr spant Leerzeichen zwischen den Feldbezeichnern haben sollte, zB: "% s% s% s ... " –

+0

Sie erwarten von' feof', ob ein zukünftiger Vorgang erfolgreich sein wird. Das ist nicht was es tut. Sie überprüfen nicht, ob 'fscanf' erfolgreich ist oder fehlschlägt. –

Antwort

0

Zuerst entfernen Sie while() und setzen Sie if(!feof(pFile) && !ferror(pFile)). In Ihrer fscanf() Datei für Autos werden Leerzeichen zwischen Typspezifizierern eingefügt. Es sollte

fscanf(pFile, "%s %s %d %d %d", cars[i].make, cars[i].model, &cars[i].year, &cars[i].cmpg, &cars[i].hmpg); cars[i].avgmpg = (cars[i].cmpg + cars[i].hmpg)/2; 

wie dieser sein, bevor in die Datei direkt zu schreiben, zunächst die Werte von struct in der Konsole nur drucken, und ob Sie es in der richtigen Art und Weise oder nicht bekommen.

Und die letzte Änderung ist Anstelle der Verwendung dieses

fprintf(outFile, "%s %s %d %-2d %-10d %-12d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 

verwenden

fprintf(outFile, "%s %s %d %d %d %d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 

Ich hoffe, dies wird Ihnen helfen.

0

während aus einer Datei wie diese

int i=0; 
while(!feof(pFile) && !ferror(pFile) && i < MAX_LEN) {  
    /* Read */ 
    i++; 
} 

Sie eingegeben haben ein Semikolon nach der zweiten for Anweisung

for(i = 0; i < MAX_LEN; i++) { 
    while(!feof(pFile) && !ferror(pFile)) { 
     /* Read */ 
    } 
} 

etwas tun, statt zu lesen, entfernen Sie es.

int total = i; 
for(i = 0; i < total; i++) { 
    /* Write to another file and stdout*/ 
} 

Es sollte dann funktionieren.

Hinweis: Die Räume in fscanf Aussage scheinen nicht

Verwandte Themen