使用fscanf我想处理包含两个浮点数的文本,浮点数之前,之间或之后的任意数量的空格(包括换行符/返回值),以及最后一个换行符。如果有多于/少于两个数字,那么我想检测到并报告错误。
这似乎适用于处理空白,但它不会检测是否存在两个以上的浮点数:
fscanf(f, "%f %f", &sx, &sy);
这似乎同样有效:
fscanf(f, "%f %f%*[ \n\t\r\f\v]\n", &sx, &sy);
有没有更好的方法来解决这个问题?
答案 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