使用 fscanf 我想处理包含两个浮点数的文本,浮点数之前、之间或之后的任意数量的空格(包括换行符/返回),以及最后的换行符。如果有更多/少于两个数字,那么我想检测到并报告错误。
这似乎适用于处理空白,但它不会检测是否存在两个以上的浮点数:
fscanf(f, "%f %f", &sx, &sy);
这似乎也同样有效:
fscanf(f, "%f %f%*[ \n\t\r\f\v]\n", &sx, &sy);
有没有更好的方法来处理这个?
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;
}
如果您具体了解必须读入多少个字符(或知道一行中的最大字符数),请使用:
fread ( stringbuffer, size, count,Filepointer );
然后使用:
sscanf()
读取两个浮点数,然后使用for
循环计算编号。读取字符串中的空格数。
您也可以使用strtok()
.
注意:读取输入流直到行尾(在您的情况下,行尾由新行标记)包括中间的空格(因为在 C 中,至少,空格也包含新行)也是模糊的。在这种情况下,最好使用和处理存储的数据以块的形式读取数据,fread
直到您到达特定的行尾。
我不知道如何使用单个 *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!
scanf("%f %f%*c", &sx, &sy);
// %*c will read and discard all eventual characters after the second float