0

次のような外部マシン (常に 4 行) から 10 秒ごとにいくつかのデータを受け取ります。

Yesterday match:
Player_1:(P=31,Reb=12)
Yesterday match:
Player_2:(P=12,Reb=2)

データを読み取る次のコードがあります(シリアルポート機能も開いて構成しています):

int learn_data(int fd)
{
  int n,i;
  char buff[200];
  memset(buff, 0, sizeof(buff));
  char* ptr;
  FILE *fp=fdopen(fd,"r");
 while(fgets(buff, sizeof(buff), fp) != NULL)
 { 
    printf("%s", buff);
 }
}

このコードでは、fgets はバッファを 1 行ずつ読み取ります。ここで私の質問は、strtok を使用してポイントとリバウンド (31,12)、(12,2) などの値を取得するにはどうすればよいですか? 1 行目と 3 行目をエスケープするにはどうすればよいですか?

4

2 に答える 2

0

プレイヤー名の形式によって異なります。特に、名前にスペースが含まれているかどうかです。私はおそらく使用します:

while (fgets(buff, sizeof(buff), fp))
{
    int points, rebounds;
    if (sscanf(buff, "%100[^(](P=%d,Reb=%d)", &points, &rebounds) == 2)
        ...process a valid entry...
}

これにより、奇妙な行 (試合情報がある行) が効果的にスキップされ、名前とポイントとリバウンドの数字がある行のみが処理されます。

于 2013-06-11T13:26:18.380 に答える
0

適切にフォーマットされた入力がある場合は、sscanf(). 次のことを試してください。

int P, Reb;
sscanf(buff, "%*7s%*d%*4s%d%*5s%d", &P, &Reb);

のみに対処するにはPlayer*、最初に行うことができますmemcmp()。お気に入り、

if(memcmp(buff, "Player_", 7) == 0) ...
于 2013-06-11T08:42:44.467 に答える