fscanf与换行符
我有fscanf从配置文件中读取设置行。这些设置具有严格预定义的格式,如下所示fscanf与换行符,c,regex,file-io,C,Regex,File Io,我有fscanf从配置文件中读取设置行。这些设置具有严格预定义的格式,如下所示 name1=option1; name2=option2; ... 所以基本上我是这样做的 fscanf(configuration,"%[^=]=%[^;];",name,option); 其中配置是文件流,名称和选项是编程缓冲区 问题是名称缓冲区包含我不想要的换行符。在“[^…]”集合中是否有我遗漏的格式说明符用于跳过换行符?无论如何,它能通过格式说明符解决吗 顺便说一句:通过写这个来吞咽换行符 "%[^=]
name1=option1;
name2=option2;
...
所以基本上我是这样做的
fscanf(configuration,"%[^=]=%[^;];",name,option);
其中配置是文件流,名称和选项是编程缓冲区
问题是名称缓冲区包含我不想要的换行符。在“[^…]”集合中是否有我遗漏的格式说明符用于跳过换行符?无论如何,它能通过格式说明符解决吗
顺便说一句:通过写这个来吞咽换行符
"%[^=]=%[^;];\n"
我认为换行符可能会在任何地方重复多次,这并不优雅。这将起作用:
fscanf(配置,“%[^=]=%[^;];%[^\n]”,名称,选项,虚拟)代码>
您必须使用新行字符。否则,新行将保留在输入流中。只需在格式字符串末尾添加空格:
"%[^=]=%[^;]; "
这将吃掉所有空白字符,包括新行
引自:
空白字符:函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——请参见isspace)。格式字符串中的单个空白验证从流中提取的任何数量的空白字符(包括无)
另一种方法是使用fgets()
将整行读入字符串,然后使用sscanf()
。这在调试中有一个优势,即您可以准确地看到函数正在处理的数据。如果nameN
字段不能包含空格,只需在格式字符串的前面添加空格-“%[^=]=%[^;];”
-跳过前导空格。如果可以,您需要使用getchar()
单独使用换行符。不管怎样,对于重复的换行符,您可以使用%*[\n]
读取任意数量的'\n'
,而不存储它们。嗯……那么dummy应该有多大呢?大到足以容纳所有可能的换行符?因为您说过您有严格的预定义输入数据格式,所以您可以精确计算所需的字符数并创建虚拟变量。这将帮助您找出与输入格式可能存在的任何偏差,而不是跳过这些偏差。(如果在fscanf或fgets中使用空格,则会发生这种情况)。结尾附近缺少一个%
,为什么不使用%[^=]=%[^;];%*[^\n]
忘了那些换行符和包含它们的缓冲区吗?@efffe:这个主意也不错。OP的问题指出,输入字符串格式将是固定的,因此我使用了这种方法,认为找出文件中的任何一行是否不符合固定格式标准可能很有用。:)