fscanf - 如何处理两个浮点数+空格+换行符?

时间:2012-11-04 19:53:30

标签: c stdio scanf

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

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

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

这似乎同样有效:

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

有没有更好的方法来解决这个问题?

4 个答案:

答案 0 :(得分:1)

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;
}

答案 1 :(得分:1)

我不知道怎么用单个* scanf来做,我认为由于你的请求的最后一部分是不可能的,* scanf无法读取与简单正则表达式匹配的任意长度的字符序列< strong>以指定字符结尾。

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!

答案 2 :(得分:1)

如果您具体说明您需要阅读多少个字符(或者想知道一行中最多的字符数),请使用:
fread ( stringbuffer, size, count,Filepointer );

然后使用: sscanf()读取两个float,然后使用for循环来计算no。读取字符串中的空格。

您也可以使用strtok()

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

答案 3 :(得分:0)

scanf("%f %f%*c", &sx, &sy);
// %*c will read and discard all eventual characters after the second float