Warm tip: This article is reproduced from serverfault.com, please click
c

c-如何使fscanf函数跳过一行?

(c - How to make fscanf function skip a line?)

发布于 2020-11-27 23:16:36

在我写问题时,我找到了这个 答案

这提供了以下解决方案以使其跳过该行fscanf(config_file, "%*[^\n]\n"); 。有效,但我还不是很了解整个内容,例如,为什么模式中有两个NEWLINE字符,每个字符代表什么,以及是否有更多有关此模式的知识

答案中的参考资料简要说明了这些字符的含义,但我想提供更完整的解释,

经过一番搜索后,我没能动用任何关于此字符的完整参考,因此,如果有人可以提供参考以供阅读或使用。将不胜感激

Questioner
Mahmoud Salah
Viewed
0
KamilCuk 2020-11-28 08:05:13

如何使fscanf函数跳过一行?

我认为你可以:

void skip_nl(FILE *f) {
    char c[2];
    fscanf(f, "%1[\n]", c) == 1 || fscanf(f, "%*[^\n]%*1[\n]");
}

请注意,%*[^\n]当行为空时扫描将失败(“ fail”,因为scanf将停止扫描)。因此,如果有一个空行,%*[^\n]将不扫描任何内容,scanf只会返回。因此,必须专门处理空行,并使用fscanf返回值来检测扫描是否成功。需要注意的是%*丢弃的扫描则没有增量scanf返回值。因此,首先scanf("%1[\n]"使用临时未使用的缓冲区仅“检测”(并丢弃)一条空行。如果该行不是空行,则%*[^\n]扫描并丢弃一个或多个非换行符,然后再%*1[\n]丢弃单个换行符。如果你确定输入的内容不会只是换行符,那么%*[^\n]%*1[\n]很好 测试了godbolt

但是真正编写以下内容并不难...:

for (int c; (c = getc(f)) != EOF && c != '\n'; ) {}