2012-05-07 8 views
1

これはとてもばかばかしいですが、私はそれに問題があります。fscanfがCで完全な行を読んでいない?

テキストファイルは、ヘッダを持っている、

例えば、

# Avizo BINARY-LITTLE-ENDIAN 2.1 

define Lattice 496 384 470 

Parameters { 
    AlignTransform { 
     slice0000 0 -0 -30 -1, 
     slice0001 0 -0 -30 -1, 
     slice0002 0 -0 -30 -1, 

そして、私は関数fscanfを使用して、これらの線のそれぞれを読みしようとしています。

int i; 
    for ( i = 0; i < 10; i++) { 
    fscanf(fp, "%s\n", buf); 
    printf("%d) %s\n",i,buf); 
    } 

だから、改行の代わりに空白を解析しています。この

0) # 
1) Avizo 
2) BINARY-LITTLE-ENDIAN 
3) 2.1 
4) define 
5) Lattice 
6) 496 
7) 384 
8) 470 
9) Parameters 

になります。何が起こっているのか分かりません。

答えて

5

fscanf%s指定子は単語を読み込むため、スペースに達すると停止します。

fgetsを使用すると、行全体を読み取ることができます。

+0

代わりにfgetsを使用して終了しました。 – Shuo

1

%sは "文字列"を意味するかもしれませんが、fscanf(scanfとして)は貪欲な数学的なものではありませんが、セパレータが "新しい行"であることを伝えてください。 そして、バッファオーバーフローを防ぐためにmaxinumバッファサイズを設定する方がよいでしょう。

#include <stdio.h> 

#define NAME_MAX 80 
#define NAME_MAX_S "80" 

int main(void) 
{ 
    static char name[NAME_MAX + 1]; // + 1 because of null 
    if(scanf("%" NAME_MAX_S "[^\n]", name) != 1) 
    { 
     fputs("io error or premature end of line\n", stderr); 
     return 1; 
    } 

    printf("Hello %s. Nice to meet you.\n", name); 
} 
6

私はあなたがfgetsを使用することをお勧めしますが、fscanfを使う、という場合:

fscanf(fd, "%[^\n]\n", buff); 

これはフルラインを読み込みます。

+0

訂正していただきありがとうございます。 –

+0

upvote for \ n –

関連する問題