0

次の形式のテキスト ファイルから:

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

それぞれを抽出して変数に入れる必要があります。

次の2つの方法を試しました。

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

これにより、間違った結果が得られ、各行に対して1つの単語しか読み取れないため、結果は次のようになります。

名前: 名前 姓:@,a ID:2272012 住所: ?"
名前: 姓 姓:@,a ID:2272012 住所: ?"
名前: ID 姓:@,a ID:2272012 住所: ?"
名前: 住所 姓:@,a ID:2272012 住所: ?"

そして、私が使用した他の方法は次のとおりです。

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) == 4){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

何も読み取らず、何も起こりません。

私が読んでいるファイルは .dat であり、割り当て用であるため、.dat のみを使用できます。

4

4 に答える 4

2
  • 表示されていないデータにコンマがない限り、フォーマット文字列にコンマを含めないでください。
  • いずれかのフィールドにスペースが含まれている場合、停止するため、これは機能しません%s
  • 入力 .dat ファイルをさらに表示する必要があります。
  • fgets()多くの場合、を使用して行全体を読み取ってから、その解析について心配する方が適切です
于 2013-01-07T15:45:23.487 に答える
2

テキストファイルの形式は次のとおりです。

string<space>string<space>numeric<space>string<newline>

それが正確な場合、フォーマット文字列は正確に一致する必要があります:

strings
 |  |  numeric
 |  |  |  +-----string
 |  |  |  | +---newline
 V  V  V  V V
"%s %s %d %s\n"
   ^  ^  ^
   |  |  |
   spaces

これは、各stringフィールドがASCII値の単一ブロックであり、スペース/タブなどがないことを前提としています。コードには、変数の定義方法がありません。おそらく次のようなものです。

char name2[100] = {0};
char surname2[100] = {0};
int id2 = 0;
char address2[100] = {0};

その場合&、文字列内のこれらの名前の前には必要ありませんfscanf。したがって、次の入力ファイルが与えられます。

最初は ast 1234 someone@something.com
秒ですが、22352 goo@gle.com
thir haha​​ 9999 nice@lly.com

そして、上記の変数宣言、次のコード:

FILE * fp;
fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %s %d %s\n", name2, surname2, &id2, address2) == 4) 
    printf("name: %s %s, id: %d, address %s\n", name2, surname2, id2, address2);

fclose(fp);

値を正しく読み取り/表示します。

于 2013-01-07T16:04:10.213 に答える
1

&まず、変数から変数を削除しますprintf

printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);

入力 txt ファイルのフィールド間の区切り文字がカンマの場合,

Name,Surname , ID ,Address
Name ,Surname,ID,Address
Name,Surname,ID,Address

次に、次の文字列形式をfscanf

while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}

入力 txt ファイルのフィールド間の区切り文字がスペースの場合

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address

次に、次の文字列形式をfscanf

while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}
于 2013-01-07T15:46:03.003 に答える
0
while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}

これがエラーがある場所だと思います:

そのはず:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        name2, surname2, id2, address2);
}
于 2013-01-07T15:46:24.143 に答える