Parsing 如果fscanf没有找到格式字符串中定义的所有值,会发生什么情况?

Parsing 如果fscanf没有找到格式字符串中定义的所有值,会发生什么情况?,parsing,input,scanf,config-files,Parsing,Input,Scanf,Config Files,在上下文中——我正在为一个类编写一个简单、独立的配置文件解析器,该类将进入一个更大的程序。我知道有像BOOST这样的非常有效的库可以为我实现这一点,但是这个类必须是严格独立的,没有外部库 因此,我有一个配置文件,可能看起来有点像这样: output_file : some_output_file.root input_file : input_file.txt potential_file : 请注意,潜在的_文件条目是空的,因此应该这样读取 我打算使用带有格式说明符的fscanf fscan

在上下文中——我正在为一个类编写一个简单、独立的配置文件解析器,该类将进入一个更大的程序。我知道有像BOOST这样的非常有效的库可以为我实现这一点,但是这个类必须是严格独立的,没有外部库

因此,我有一个配置文件,可能看起来有点像这样:

output_file : some_output_file.root
input_file : input_file.txt
potential_file :
请注意,潜在的_文件条目是空的,因此应该这样读取

我打算使用带有格式说明符的fscanf

fscanf(cfg_file,"%s : %s\n",flag,value);

但是,在潜在的_文件标志的情况下会发生什么?字符串值是否为空?或者fscanf会尝试读取文件中的下一个可用字符串吗?

您应该检查fscanf的返回值。它返回成功解析的参数数。如果按照模式,第三行冒号后没有空格,则不会为您生成空字符串。在这种情况下,它将停止解析。如果您想在不进行额外检查的情况下保持安全,请在fscanf之前初始化值

%s表示在找到空白之前读取后续字符。后者定义为空白、换行或制表符。所以它不会跳到下一行


也考虑一些库来配置,因为你用这种方式标注了问题。易于阅读,并且具有C绑定。

感谢您提供了信息丰富的答案。我知道有一些外部库可以简单地处理这个问题,但不幸的是,我不能使用它们-代码必须完全独立。如果您希望获得一些防止格式异常的保护,最好将其逐行读取到缓冲区中,然后将scanf应用到缓冲区中的一行。