0

私はファイルを持っています:

hello:12312
Bye:333
Hey:22

だから私は fscanf を使ってそれを読んだ

 FILE *file = fopen( argv[1], "r" );

        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else
        {

            while(fscanf(file, "%[^:]:%d", word, &integer) != EOF)
            {
                printf("word: %s, integer: %d\n", word, integer);
            }

            fclose( file );
        } 

そして、これは私が得たものです:

word: hello, integer: 12312
word:
Bye, integer: 333
word:
Hey, integer: 22

どうやら最初の単語を除いて余分な空白があるようですが、なぜこれが起こっているのですか?

4

4 に答える 4

3

%[^:]行末を受け入れます。先頭の空白を試してみるのをスキップしたい場合word:

 " %[^:]:%d"
于 2013-05-09T16:03:05.590 に答える
3

からfscanf():

[、c、および n 以外のすべての変換指定子は、入力の解析を試みる前に、すべての先頭の空白文字を消費して破棄します。

そして は の\n後も入力ストリームのまま"%d"です。

フォーマット speicifer に先行スペースを追加して空白をスキップするには、次のようにします。

while(fscanf(file, " %[^:]:%d", word, &integer) == 2)
{
}

またはの形式の行を受け入れないように を に変更し!= EOFました。== 2"hello:""hello"

于 2013-05-09T16:04:51.137 に答える
1

文字列フォーマットの先頭にスペースを追加してください" %[^:]:%d"。これにより、scanf の改行の問題が回避されます。

 while(fscanf(file, " %[^:]:%d", word, &integer) != EOF)
于 2013-05-09T16:03:13.157 に答える
1

*scanf() 関数を使用して整数を読み取る場合、次の改行は消費されないためです。

于 2013-05-09T16:04:10.270 に答える