0

各行が次のようなファイルがあります。

cc ssssssss,n

ここで、最初の 2 つの 'c' は個々の文字で、場合によってはスペース、その後にスペースが続き、's' は 8 または 9 文字の長さの文字列で、次にカンマと整数が続きます。

私はcに本当に慣れていないので、これを行ごとに4つの個別の変数(最初の2文字、文字列、数字のそれぞれ)に入れる方法を見つけようとしています

助言がありますか?fscanf と strtok を見てきましたが、これを機能させる方法がわかりません。

ありがとうございました。

4

3 に答える 3

5

質問が示唆するように、これは C の質問であり、おそらくタグが示唆するような C++ ではないと想定しています。

  1. 行全体を読み込んでください。

  2. strchrカンマを見つけるために使用します。

  3. 最初の 2 文字で好きなことをしてください。

  4. カンマをゼロに置き換えて、文字列の終わりを示します。

  5. 4 文字目以降を呼び出しstrcpyて、その部分を抽出しsssssssます。

  6. atoiコンマが整数を抽出する場所の 1 つ後ろの文字で呼び出します。

于 2013-03-01T07:33:54.050 に答える
0

文字列は、最初の で終わる一連の文字です'\0'。これを覚えておいてください。説明したファイルにあるものは文字列ではありません。

nは、複数の小数点以下桁数にまたがる可能性のある整数であり、負になる可能性があると思います。その場合、必要なフォーマット文字列は"%2[^ ] %9[^,\n],%d". fscanf次の式を渡します。

  1. あなたのFILE *
  2. フォーマット文字列、
  3. サイレントにポインターに変換された 3 文字の配列、
  4. サイレントにポインターに変換された 9 文字の配列、
  5. ...そしてへのポインタint

fscanf の戻り値を int に格納します。fscanf が負の値を返す場合は、EOF やその他の読み取りエラーなどの問題があります。それ以外の場合、 fscanf は、値を代入したオブジェクトの数を示します。この場合、探している「成功」値は 3 です。それ以外は、入力の形式が正しくないことを意味します。

詳細および/または明確化のために、 fscanfマニュアルを読むことをお勧めします。

于 2013-03-01T08:03:04.323 に答える
0

fscanf関数は非常に強力で、タスクを解決するために使用できます。

  1. 2 つの文字を読み取る必要があります。形式は「%c%c」です。
  2. 次に、スペースをスキップします (フォーマット文字列に追加するだけです) - "%c%c ".
  3. 次に、コンマに到達するまで文字列を読み取ります。最大文字列サイズを指定することを忘れないでください。したがって、形式は「%c%c %10[^,]」です。10 - 読み取る最大文字数。[^,] - 許可された文字のリスト。^, - は、コンマを除くすべてを意味します。
  4. 次にコンマをスキップします - "%c%c %10[^,],"。
  5. そして最後に整数を読み取ります - "%c%c %10[^,],%d"。
  6. 最後のステップは、4 つのトークンがすべて読み取られたことを確認することです。fscanf の戻り値を確認してください。

完全なソリューションは次のとおりです。

FILE *f = fopen("input_file", "r");

do
{
    char c1 = 0;
    char c2 = 0;
    char str[11] = {};
    int d = 0;

    if (4 == fscanf(f, "%c%c %10[^,],%d", &c1, &c2, str, &d))
    {
        // successfully got 4 values from the file
    }
}
while(!feof(f));

fclose(f);
于 2013-03-01T08:14:59.970 に答える