2

ファイルに文字列のコンマ区切りリストがあります。

名前1、名前2、名前3

すべてのコンマをスキップしてそれらの名前を読みたいです。私は次のループを書きました:

while(true)
{
    if(fscanf(file, "%[^,],", my_string) != 1)
    {
        break;
    }

    //...
}

ただし、常に想定よりも1回多く実行されています。ファイルに3つの名前が指定されている場合、ループはそのステートメントを4回実行します。なぜこうなった?EOFインジケーターは否定されたスキャンセットにランク付けされますか[^、]?もしそうなら、どうすればこの問題を解決できますか?

4

2 に答える 2

2

私はこれがあなたが望むことを正確に行っていると確信しています。%私が行ったアルゴリズムへの唯一の変更は、フォーマット文字列の前に先頭の空白をクリアすることです。また、コマンドライン引数からファイルを開くようにこれを変更しました。その方法でテストする方が簡単です。大丈夫だといいのですが。

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

int main(int argc, char *argv[])
{
    if (argc != 2)
        return EXIT_FAILURE;

    FILE *fp = fopen(argv[1], "r");
    if (NULL == fp)
        return EXIT_FAILURE;

    char str[100];
    int count=0;
    while (1)
    {
        if(fscanf(fp, " %[^,],", str) != 1)
            break;
        printf("%s\n", str);
        ++count;
    }

    printf("Parsed %d strings.", count);
    return EXIT_SUCCESS;
}

出力

Name 1
Name 2
Name 3
Parsed 3 strings.

あなたが見ているループの「4番目の」実行は失敗状態であると私は信じています。それは私が何かを見逃しているか、あなたが目撃していることを理解していない限り、解析の失敗のためにループを壊します。

于 2013-01-24T21:38:02.280 に答える
0

ループステートメントが4回実行されるのはなぜですか。4番目のfscanfステートメントの後でループが中断し、以下のコードが実行されません。EOFインジケーターは否定されたセットにランク付けされません。ただし、次のようなよりコンパクトなソリューションを探している可能性があります。

while(fscanf(file, "%[^,],", my_string)!=EOF )
    {

        //do something
    }

そうでない場合は、より詳細なコードとテストファイルを投稿してください

于 2013-01-24T21:47:02.893 に答える