2014-01-19 6 views
0

*.txt 파일에 번호 목록이 있습니다파일에서 숫자를 읽고 평균을 계산하는 방법은 무엇입니까?

1 2 
3 

numbers.txt을했다. 나는 그들을 읽고 평균을 계산할 필요가있다. 내 파일은 다음과 같다. (1 + 2 + 3)/3 = 2; 내 코드가 잘못된 결과를 보여 주지만 3 번 읽는다. 왜 그게, 어떻게 해결할 수 있습니까?

내 코드 : 읽기가 파일의 끝을 시도했습니다 통과 할 때까지 테스트 fscanf()

while(fscanf(f, "%lf", &tmp) != EOF) { 
    printf("tmp = %f \n", tmp); 
    sum += tmp; 
    ++ i; 
} 

feof(f)feof() 테스트에서

#include <stdio.h> 
#include <stdlib.h> 

double fun(const char *filename) 
{ 
    double sum = 0, mean = 0, tmp = 0; 
    int i = 0; 
    FILE *f; 
    if((f = fopen(filename, "r")) == NULL) 
    { 
     exit(-1); 
    } 

    while(!feof(f)) 
    { 
     fscanf(f, "%lf", &tmp); 
     printf("tmp = %f \n", tmp); 
     sum += tmp; 
     ++ i; 
    } 

    i = i - 1; 
    mean = sum/i; 

    fclose(f); 

    printf("i = %d\n", i); 
    printf("sum = %f\n", sum); 
    printf("mean = %f\n", mean); 

    return mean; 
} 

int main(int argc, char **argv) 
{ 
    fun("numbers.txt"); 

    return 0; 
} 

답변

3

변경은 사실이 아니다. 따라서 fscanf(f, "%lf", &tmp)의 이전 호출은 tmp을 업데이트하지 않고 OP의 원래 코드에서 EOF을 반환했습니다. 그래서 tmp3 인 것처럼 보입니다. @BLUEPIXY가 지적 하듯이


i = i - 1;가 필요하지 않습니다. 입력이없는 드문 경우를 위해 if (i==0)의 테스트가 추가 될 수 있습니다.

+0

가장 좋은 해결책은'int cnt; 'EOF'는 EOF 또는 입출력 에러를 의미하고, 0은 '이중'으로 변환하지 못했음을 의미하고, 1 : 1 개의 성공적인 변환을 의미합니다. – chux

+0

괄호 안의 숫자는 이전 주석에 정렬되지 않았습니다. – BLUEPIXY

4

실제로는 3 번을 두 번 읽지 않습니다.

문제는 마지막 번호 (3) 후, 다른 문자, 즉 공백이 있다는 것입니다. 따라서 마지막 숫자를 읽은 후 EOF 플래그가 올라가지 않고 while 루프가 다른 반복을 입력합니다. fscanf은 값을 읽지 않지만 이전 값은 여전히 ​​tmp이며 다시 처리됩니다. 당신이 무엇을해야

, 당신에게 실제로 스캔 변환 매개 변수의 수를 알려줍니다 fscanf의 반환 값을 확인합니다. 하나의 변수를 스캔하려고하기 때문에 1이어야합니다. 코드를 다음과 같이 수정하십시오 :

while(!feof(f)) 
{ 
    if (fscanf(f, "%lf", &tmp) != 1) { 
     // No numbers 
     break; 
    } 

    printf("tmp = %f \n", tmp); 
    sum += tmp; 
    ++ i; 
} 

i = i - 1을 제거하십시오. 루프가 의도 한 것보다 한 번 더 반복하고 있다는 사실을 보완하기 위해이 코드를 써야했습니다.

2

무엇이 일어 났는지를 결정하기 위해 feof (f는) 당신이 기대하는 것보다 루프를 한 번 더 입력하기 때문에 3 개의 시간을 읽을 수 있습니다. 데이터 읽기 전에 무엇이 일어 났는지를 결정하기 위해 feof이 경우

는()가 호출, 그래서 그것은 false를 반환합니다. 루프가 시작되고 fgetc()가 호출되고 (EOF를 반환) count가 증가합니다. 그런 다음 feof()가 호출되고 true를 반환하면 루프가 중단됩니다.

관련 문제