2015-09-20 16 views
5
char id; 
int num, r; 
if (argc != 2) { 
    printf("error\n"); 
    exit(1); 
} 

FILE *file = fopen(argv[1], "r"); 
if (file == NULL) { 
    printf("error\n"); 
    exit(1); 
    } 

    while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 
    if(r == 2) { 
     printf("id: %c, value: %d\n", id, num); 
    } 
    else if (r!=2) { 
     printf("bad input\n"); 
    } 
    } 

私がどのように見える読みしようとしているファイル:関数fscanf - 私は私が間違ってやっているのか分からない、ここで

を私は10

私は12

D 10

D 12

(文字/整数はタブで区切られています)。私の出力は、次のとおり

ID:I値:10

悪い入力

ID:I値:12

悪い入力

ID:D、値: 10

悪い入力

ID:D、値:12

悪い入力

私が間違って何をやっていますか? 「不正な入力」は、ファイルのフォーマットが正しくない場合にのみ印刷してください。上記のファイルは、適切にフォーマットされたファイルを示しています。 r == 2r != 2が同時に何らかの形で満たされていることを理解できません。

+0

EOFを返すためにscanfをチェックしないでください。期待されるアイテムの数が返されるかどうかをチェックする必要があります。 –

+0

'\ n'とスペースも重要です。 – Matt

+0

'FILE'が開かれている場合は' exit'しないでください:きれいに閉じられません。 – edmz

答えて

4

使用

while((r = fscanf(file, " %c\t%d", &id, &num)) != EOF) //Whitespace before %c 

はあなたの問題を解決する可能性があります。使用時のため

fscanf(file, "%c\t%d", &id, &num) 

次に、次の繰り返しで消費される改行文字が残ります。 あなたの次の反復として、id\nnumは文字を取得します。

%cの前に余分な空白を置くと、fscanf()には、空白(タブ、スペース、改行を含む)を無視するように指示されます。 fscanf()は2つのパラメータ(文字と数字)を取得します。

+3

なぜ空白が違いを生み出したのか説明してください。どうもありがとうございます! – Sara

+0

偉大な答え。どうもありがとうございました。 – Sara

2

関数fscanfで終わりに\ nを追加

while ((r = fscanf(file, "%c\t%d\n", &id, &num)) != EOF) { 

while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 

を変更してください。

ファイルでは、行は\ nで終了します。 次はそれがうまくいきません。

関連する問題