2017-04-07 5 views
2

현재 알 수없는 두 배의 숫자를 텍스트 파일에서 각자의 줄에 가져 오는 프로그램을 작성하고 있습니다. 이 요소를 배열에 배치해야하지만 작동하지 않습니다. 내 인쇄 루프가 작동하지만 0 만 인쇄합니다. 나는 많은 것을 시도했고 여기에 오기 전에 많은 것을 보았다. 이것은 내 코드입니다. 너무 많은 숫자가 파일에 있다면 코드도 확인하지 않았다 제외 fscanf() 결과fscanf를 사용하여 C에서 복식을 읽는 방법

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

int main() 
{ 
    //Open an file to read from 
    FILE *file; 
    file = fopen("data.txt","r"); 
    if (file == NULL) 
    { 
     printf("File not found."); 
     return -1; 
    } 

    //Count the number of lines in the input file 
    int numLines = 0; //CHANGE TO 1 ??? 
    int ch; 
    do 
    { 
     ch = fgetc(file); 
     if (ch == '\n') 
      numLines++; 
    } while (ch != EOF); 

    //Put all of the data read into an array; 
    double input[numLines]; 
    int i = 0; 
    while ((fscanf(file, "%lf\n", &input[i])) == 1) 
     i++; 

    //Close the file 
    fclose(file); 

    //Test printing elements of array 
    for (i = 0; i < numLines; i++) 
     printf("%lf\n", input[i]); 

    return 0; 
} 
+6

줄을 계산 한 후에 파일 포인터를 ['rewind'] (https://linux.die.net/man/3/rewind)해야합니다. 그렇지 않으면 파일의 끝 부분에 있습니다. 실제 입력 데이터를 읽으십시오. –

+1

'% lf "("% lf \ n "이 아닌)와 같은 형식을 사용하여 뒤 공백이 아닌 선행 공백을 건너 뛰고 싶습니다. – Jens

+0

'printf ("% f \ n", input [i]);''l '은 floats에 대한 printf 형식 지정자가 있으므로 영향을받지 않습니다. 자동 지정은 double . – bruceg

답변

0

OP의 테스트는, 좋은입니다.

while ((fscanf(file, "%lf\n", &input[i])) == 1) 
    i++; 

그런 다음 코드는 i의 마지막 값을 무시하고 대신 적은 성공적으로 스캔 된 경우에도, numLines 번 인쇄.

for (i = 0; i < numLines; i++) 
    printf("%lf\n", input[i]); 

종료 코드가

while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1) 
    i++; 
for (j = 0; j < i; j++) 
    printf("%lf\n", input[j]); 

를 있었어야이 0 선을 인쇄 한 것입니다! 파일을 두 번째 패스에 대해 재설정해야했습니다. 또 다른 문제는 '\n'의 수를 가정한다 @paulr

rewind(file); 
while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1) 
    ... 

숫자의 개수와 동일하다. 한 줄에 여러 개의 숫자가 있거나 숫자가 아직없는 마지막 줄이 있으면 쉽게 속일 수 있습니다. '\n'.

간단히 해결하면 input[] 1을 더 크게 만들고 실제 스캔 성공 횟수를 인쇄 할 숫자의 수로 사용하십시오. 더 견고한 코드는 한 번에 한 줄씩 fgets()으로 읽고 추가 오류 검사를 포함합니다.