fscanf与换行符

fscanf与换行符,c,regex,file-io,C,Regex,File Io,我有fscanf从配置文件中读取设置行。这些设置具有严格预定义的格式,如下所示 name1=option1; name2=option2; ... 所以基本上我是这样做的 fscanf(configuration,"%[^=]=%[^;];",name,option); 其中配置是文件流,名称和选项是编程缓冲区 问题是名称缓冲区包含我不想要的换行符。在“[^…]”集合中是否有我遗漏的格式说明符用于跳过换行符?无论如何,它能通过格式说明符解决吗 顺便说一句:通过写这个来吞咽换行符 "%[^=]

我有fscanf从配置文件中读取设置行。这些设置具有严格预定义的格式,如下所示

name1=option1;
name2=option2;
...
所以基本上我是这样做的

fscanf(configuration,"%[^=]=%[^;];",name,option);
其中配置是文件流,名称和选项是编程缓冲区

问题是名称缓冲区包含我不想要的换行符。在“[^…]”集合中是否有我遗漏的格式说明符用于跳过换行符?无论如何,它能通过格式说明符解决吗

顺便说一句:通过写这个来吞咽换行符

"%[^=]=%[^;];\n"
我认为换行符可能会在任何地方重复多次,这并不优雅。

这将起作用:

fscanf(配置,“%[^=]=%[^;];%[^\n]”,名称,选项,虚拟)


您必须使用新行字符。否则,新行将保留在输入流中。

只需在格式字符串末尾添加空格:

"%[^=]=%[^;]; "
这将吃掉所有空白字符,包括新行

引自:

空白字符:函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——请参见isspace)。格式字符串中的单个空白验证从流中提取的任何数量的空白字符(包括无)


另一种方法是使用
fgets()
将整行读入字符串,然后使用
sscanf()
。这在调试中有一个优势,即您可以准确地看到函数正在处理的数据。

如果
nameN
字段不能包含空格,只需在格式字符串的前面添加空格-
“%[^=]=%[^;];”
-跳过前导空格。如果可以,您需要使用
getchar()
单独使用换行符。不管怎样,对于重复的换行符,您可以使用
%*[\n]
读取任意数量的
'\n'
,而不存储它们。嗯……那么dummy应该有多大呢?大到足以容纳所有可能的换行符?因为您说过您有严格的预定义输入数据格式,所以您可以精确计算所需的字符数并创建虚拟变量。这将帮助您找出与输入格式可能存在的任何偏差,而不是跳过这些偏差。(如果在fscanf或fgets中使用空格,则会发生这种情况)。结尾附近缺少一个
%
,为什么不使用
%[^=]=%[^;];%*[^\n]
忘了那些换行符和包含它们的缓冲区吗?@efffe:这个主意也不错。OP的问题指出,输入字符串格式将是固定的,因此我使用了这种方法,认为找出文件中的任何一行是否不符合固定格式标准可能很有用。:)