1

使用 fscanf 我想处理包含两个浮点数的文本,浮点数之前、之间或之后的任意数量的空格(包括换行符/返回),以及最后的换行符。如果有更多/少于两个数字,那么我想检测到并报告错误。

这似乎适用于处理空白,但它不会检测是否存在两个以上的浮点数:

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

如果您具体了解必须读入多少个字符(或知道一行中的最大字符数),请使用:
fread ( stringbuffer, size, count,Filepointer );

然后使用: sscanf()读取两个浮点数,然后使用for循环计算编号。读取字符串中的空格数。

您也可以使用strtok().

注意:读取输入流直到行尾(在您的情况下,行尾由新行标记)包括中间的空格(因为在 C 中,至少,空格也包含新行)也是模糊的。在这种情况下,最好使用和处理存储的数据以块的形式读取数据,fread直到您到达特定的行尾。

于 2012-11-04T20:42:57.370 回答
1

我不知道如何使用单个 *scanf 来执行此操作,由于您的请求的最后一部分,我认为这是不可能的,*scanf 无法读取与简单正则表达式匹配并以 a 结尾的任意长度字符序列指定字符

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 回答
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 回答