2016-10-01 3 views
0

내 프로그램은 .DAT 파일의 숫자를 표시하는 데 사용됩니다. 각 줄에는 2 개의 필드가 있습니다. 예를 들어 : .DAT 파일의 내용 :fgets를 사용하여 C에서 빈 행 건너 뛰기

1 2.2 
3 10.9 

10 100 

는 .DAT 파일에 4 개 라인이 있습니다. 첫 번째 줄에서 field1은 "1"이고 field2는 "2.2"입니다. 3 번 줄은 빈 줄입니다. 우리가있는 .DAT 파일에 참조로

내 프로그램은 동일한 형식으로 숫자를 표시하는 데 사용됩니다 :

1 2.2 
3 10.9 

10 100 

나는 우분투에서 내 모든 프로그래밍을한다. gcc에서 프로그램 컴파일 및 실행.

내 코드는 다음과 같습니다 :

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

int main() 
{ 
    FILE *fp = fopen("number.dat", "r"); 
    if (fp == NULL) 
    { 
     fprintf(stderr, "ERROR: cannot open the file\n"); 
     return 1; 
    } 

    char *field1 = NULL; 
    char *field2 = NULL; 

    char line[100]; 
    while(fgets(line, 100, fp)!=NULL) 
    { 
     if(line[0] != '\n') 
     { 
      field1 = strtok(line, " "); 
      field2 = strtok(NULL, " "); 

      printf("%s ", field1); 
      printf("%s", field2); 
     } 
     else 
     { 
      printf("Blank Line!"); 
     } 
    } 
    fclose(fp); 

    return 0; 
} 

그러나, 나는이 프로그램을 실행 한 후, 그 결과는 다음과 같다 :

1 2.2 
3 10.9 

(null)10 100 

내가 왜 이해하지 않는다 "(널)"표시됩니다 "공백 라인!"대신. 누군가가 문제의 원인을 찾도록 도와 줄 수 있습니까?

+2

빈 줄에는 공백 문자 (탭 등)가 포함될 수 있습니다. 'fgets()'가 그것들을 집을 것이다. 그러나'strtok()'호출은 공백 문자 이외의 공백 문자를 선택하지 않습니다. – Peter

+0

@alk "rt"를 시도했습니다. 하지만 여전히 작동하지 않습니다. –

+0

@Gareth lam - 수정 한 후에 GCC와 잘 작동합니다. –

답변

0

if(line[0] != '\n') 대신 if(line[0] != '\r' && line[0] != '\n')을 사용하십시오.

+0

어? OP는'strcmp()'가 아닌 그것을 사용하고 있습니다. – Peter

+0

'strcmp()'에 대한 호출이 보이지 않습니다. – alk

+0

@Peter Gareth의 코드가 변경 될 수도 있습니다. –

0

빈 줄에는 공백이 포함될 수 있습니다. 선행 공백을 건너 뛰는 함수를 작성할 수 있습니다. 또는 공백을 자동으로 무시하는 sscanf()을 사용할 수 있습니다. 또한 숫자를 정수 및 부동 소수점으로 직접 읽을 수 있습니다.

int field1; 
double field2; 

char line[100]; 
while(fgets(line, 100, fp)!=NULL) 
{ 
    int num_matches = sscanf(line, "%d %lf", &field1, &field2); 

    if(num_matches == 2){ 
     printf("%d %.2lf\n", field1, field2); 
    } 
    else 
    { 
     printf("Malformatted line\n"); 
    } 
} 
fclose(fp);