0

私はこの宿題を持っており、ファイルから1行ずつ読み取り、それを解析する必要があります。

テキストファイルは次のようになります。行数はファイルごとに異なります。

NGM8 Nguyen, Michael; 25 30 45 20
SIS7 Sinn, Scott; 30 25 20 21
SMJ0 Smith, Jacob; 27 25 24 26
.....etc

ここで、最初の列は個人のID、次の列は名前、最後の4つの数字は4週間の週あたりの売上高です。

このファイルを読み取るための私のコードセグメントは次のとおりです。

char id[5];
char name[50];
int i1, i2, i3, i4;
fgets(temp, sizeof(temp), infile); // where infile is the file pointer passed to this function from main. The file opened successfully in main.


sscanf(temp, "%s %s; %d %d %d %d", id, name, &i1, &i2, &i3, &i4);
printf("id=%s name=%s sales: %d %d %d %d\n", id, name, i1, i2, i3, i4);

上記のprintfに基づく画面出力は次のとおりです。

id=2685531 name=Johnson, sales: 0 16777216 0 7557016

誰かがこれを手伝ってくれますか?これらの変数の値を正しく読み込むには、sscanfステートメントはどのようになりますか?

ありがとう。

4

1 に答える 1

1

コメントで述べたように、%s指定子は空白またはデータの終わりまで読み取ります。したがって、文字で区切られた文字列トークンを読み取りたい場合は、別の';'ものを使用する必要があります。幸いなことに、%[受け入れる文字のセット、またはより多くの場合は便利な文字のセットを提供して一致を停止できる指定子があります。

次のことを試してください。

sscanf(temp, "%s %[^;]; %d %d %d %d", id, name, &i1, &i2, &i3, &i4);
//               ^^^^^

2番目のトークン(名前に対応)は、セミコロンに達するまで文字を読み取ります(そして、入力ストリームにセミコロンを残します-したがって、;その文字を消費するためにそれに続くリテラル)。

FWIW、私はscanf()関数を使用してデータを解析することはあまり好きではありません。エラーやコーナーケースを処理し、文字列のバッファー境界を超えないようにするのは難しい場合があります。ただし、宿題の割り当てや、実際に固定形式の入力ファイルがある場合は、多くの場合問題ありません。

于 2013-03-11T16:38:47.940 に答える