1

fscanfを使用して、2つのフロート、フロートの前、間、または後の任意の量の空白(改行/戻りを含む)、および最後に改行文字を含むテキストを処理したいと思います。数字が2つより多い/少ない場合は、それを検出してエラーを報告したいと思います。

これは空白を処理するために機能するようですが、3つ以上のフロートが存在するかどうかは検出されません。

fscanf(f, "%f %f", &sx, &sy);

そして、これも同様に機能するようです。

fscanf(f, "%f %f%*[ \n\t\r\f\v]\n", &sx, &sy);

これを処理するためのより良い方法はありますか?

4

4 に答える 4

2
fscanf(f, "%f%f", &one, &two);
while (1) {
  ch = fgetc(f);
  if (ch == EOF) /* end of input whithout a line break */break;
  if (ch == '\n') /* input ok */break;
  if (!isspace((unsigned char)ch)) /* bad input */break;
}
于 2012-11-04T20:14:15.287 に答える
1

単一の*scanfでそれを行う方法がわかりません。リクエストの最後の部分のため、可能ではないと思います。* scanfは、単純な正規表現に一致し、で終わる任意の長さの文字シーケンスを読み取ることができません。指定された文字

int character;
bool trailingNewLine;

if (fscanf(f, "%f%f", &sx, &sy) < 2)
    // not matching "whitespace-float-whitespace-float"
    // being more accurate could be painful...

// read arbitrary quantity of white space ending with '\n'
while (isspace(character = getc(f)))
    trailingNewLine = (character == '\n');

// the last one wasn't white space, doesn't belong to this one
ungetc(character, f);

if (!trailingNewLine)
    // missing newline at the end

// OK!
于 2012-11-04T20:30:24.210 に答える
1

読み込む必要のある文字数が特定されている場合(または1行の最大文字数がわからない場合)は、次を使用します。
fread ( stringbuffer, size, count,Filepointer );

次に、: sscanf()を使用して2つのフロートを読み込み、forループを使用して番号をカウントします。読み取り文字列の空白の数。

を使用することもできますstrtok()

注:行の終わり(この場合、行の終わりは新しい行でマークされます)まで入力ストリームを読み取ることも(Cでは少なくとも空白には新しい行が含まれるため)間に空白が含まれます漠然。freadその場合は、特定の行末に到達するまで、保存されたデータを使用して処理し、データをチャンクで読み取る方が適切です。

于 2012-11-04T20:42:57.370 に答える
0
scanf("%f %f%*c", &sx, &sy);
// %*c will read and discard all eventual characters after the second float
于 2020-06-21T11:01:15.127 に答える