2016-07-17 5 views
1

클래스에 대한 과제를 진행하고 있는데 파일 입출력 및 구조체를 함께 적용하는 데 문제가 있습니다. 파일에서 다른 자동차를 읽고 구조체 배열에 정보를 복사하는 코드가 있습니다. C 프로그램 : 파일을 읽고 구조체에 복사 하시겠습니까?

#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; 
    } 

처럼 .txt 파일이 모습입니다 : 나는 자동차가 제대로 읽는다면 내가 볼 수있는 내 코드에 인쇄 기능을 삽입

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 

,하지만 난 프로그램이 실행시 출력은 다음과 같습니다

▒▒▒8 0 0 1465899048 32767

내가 왜 이런 일 전혀 생각이 없다. 아무도 도와 줄 수 있니?

+0

'에 대한 (전 = 0; i가 MAX_LEN을 <; 내가 ++) { 동안 (무엇이 일어 났는지를 결정하기 위해 feof (PFILE) && ferror 함수 (!! – BLUEPIXY

+0

당신의 부족한 부분에 필드 지정자 사이에 공백이 있어야한다고 생각합니다 : "% s % s % s (예 :"% s % s % s " ... " –

+0

미래 작업이 성공할지를 예측하는 'feof'를 기대하고 있습니다. 그것은 그것이하는 것이 아닙니다. 'fscanf'가 성공했는지 실패했는지는 확인하지 않습니다. –

답변

0

처음으로 while()을 제거하고 if(!feof(pFile) && !ferror(pFile))을 입력하십시오. fscanf() 자동차 파일의 경우 유형 지정자 사이에 공백을 넣으십시오. 그것은이

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; 

처럼 직접 파일에 쓰기 전에, 먼저 적절한 방법으로 그것을 얻거나하지 만, 여부 콘솔에 struct의 값을 인쇄해야합니다.

그리고 마지막 수정이 대신이

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); 

사용이

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); 

을 사용하고는 내가 당신을 도울 바랍니다.

0

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

대신 파일에서 읽는 동안하는 당신은 두 번째 for 문 다음에 세미콜론을 입력 한이

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

그런 짓을 제거합니다.

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

그러면 작동합니다.

: fscanf 문에 공간은 중요하지 않는 것