【发布时间】:2021-06-01 22:29:33
【问题描述】:
所以,我想用fscanf读取两个整数变量中的一些输入,输入必须是
INTEGERONE SPACEINTEGER\n
例如,一个文件可能是这样的:
235 190\n
我想要做的是检查在第一个整数或第二个整数之前是否有任何新行,如果是这种情况则抛出异常:
所以基本上你对fscanf 的处理方式就是:
FILE *somefile;
[...]
int w, h;
if (fscanf(somefile, "%d%d") == EOF)
return (1);
但此方法不提供检查整数之间是否有新行
(例如,如果有INTEGER NEW_LINE INTEGER 它仍然会读取第二个)
因为它在看到一个数字之前会跳过所有空格,所以我设法做的更接近但仍然是错误的:
FILE *somefile;
int w, h;
char check[2];
if (fscanf(somefile, "%d%c%d%c", &w, check, &h, check + 1) == EOF)
return (-1);
if (check[0] != ' ' || check[1] != '\n')
return (-1);
所以在我这样做之后,我意识到%d 之前的%c 只读取一个字符,所以如果两者之间有空格然后换行,它将继续错误地读取文件并且不会检测到错误。
现在我想知道是否有一种方法可以跳过所有空格,例如使用" %c" 时,同时知道我们是否跳过了\n。感谢您的帮助。
PS:我知道我们可以使用fgets 和strtol,但这太容易了,在这个项目中我只能使用fscanf 来解析文件。
【问题讨论】:
-
Read a whole line 首先。然后使用
sscanf解析该行,并检查sscanfreturns2。 -
scanf很乐意丢弃所有空格以匹配%d,因此它对您没有用处。 -
如果您只能使用
fscanf(),您将被推入一条痛苦的道路。对于所需的输入格式,fscanf()大多是正确工作的错误工具。您可以使用它,但您将不得不非常努力地工作,多次调用它,并且您可能需要使用ungetc()作为处理的一部分。工作量将是可怕的!请参阅 William Pursell 的回答,并将对getchar()的每个调用替换为对fscanf()的调用以读取一个字符并进行测试以查看您是否获得了正确的字符(加上ungetc()以在必要时将其放回原处)。