在我写问题时,我找到了这个 答案
这提供了以下解决方案以使其跳过该行fscanf(config_file, "%*[^\n]\n");
。有效,但我还不是很了解整个内容,例如,为什么模式中有两个NEWLINE字符,每个字符代表什么,以及是否有更多有关此模式的知识
答案中的参考资料简要说明了这些字符的含义,但我想提供更完整的解释,
经过一番搜索后,我没能动用任何关于此字符的完整参考,因此,如果有人可以提供参考以供阅读或使用。将不胜感激
如何使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'; ) {}
好吧,我需要跳过出现特定字符时出现的空行,我认为fscanf和fseek对我来说比循环更好,但还是谢谢
最好
||
做第fscanf(f, "%1[\n]", c)
一个(UV),但fscanf(f, "%1[\n]", c) != 0
最好在文件结尾或输入错误以及时退出"\n"
。发生输入错误时,最好不要继续。