2016-10-01 18 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 

私はUbuntuの中のすべての私のプログラミングを行います。 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);