【发布时间】:2020-07-10 07:23:01
【问题描述】:
这个问题似乎已经被问过了,但我没有为我的案例找到任何方便的解决方案。 我有以下 TXT 配置文件要在 C++ 中读取:
--CONFIGURATION 1 BEGIN--
IP address: 192.168.1.145
Total track length [m]: 1000
Output rate [1/s]: 10
Time [s]: 1
Running mode (0=OFF 1=ON): 1
Total number of attempts: 10
Mode (0=OFF, 1=BEG, 2=ADV, 3=PROF): 1
--Available only for Administrators--
Variable 1 [mV]: 2600
Gain 1 [mV]: 200
Position tracking (0=OFF 1=ON): 0
Coefficient 2 [V]: 5.2
--CONFIGURATION 1 END--
--CONFIGURATION 2 BEGIN--
Max track distance [m]: 10000
Internal track length [m]: 100
Offset distance [mV]: 1180
GAIN bias [mV]: 200
Number of track samples: 1000
Resolution (1 or 2) [profile]: 1
--CONFIGURATION 2 END--
我只需要在每行末尾存储一个值,该值可以是一个字符串(在 IP 地址的情况下)、一个 int、一个浮点数或一个结构体中的布尔值。在 C 中有一个非常简单的解决方案,我使用如下表达式读取每一行:
if(!fscanf(fp, "%*s %*s %*s %*s %d\n", &(settings->trackLength))) {
printf("Invalid formatting of configuration file. Check trackLength.\n");
return -1;
}
%*s 允许丢弃行的标签和感兴趣的值之前的空格。我使用 fgets 跳过空行或标题。这种方式也适用于 C++。让我的代码保持原样好还是你看到了在 C++ 中更好更简单的方法? 非常感谢。
【问题讨论】:
-
读取整行,然后解析它们。此外,避免遗留 C 的东西(如
scanf等),如 C++ 中的瘟疫。 -
/n在scanf格式字符串的末尾并没有按照您的想法执行。 -
首先,感谢海德的评论。是的,我已经看到了这种方式,但是为什么我应该用更多的代码行来替换已经完成我想要的工作的单个(和简单的)代码行来做同样的事情呢? C++ 中没有一个表达式可以满足要求吗?再次感谢您。
-
看起来您的
fscanf在您的示例代码中是完全错误的(至少它与您的输入文件不匹配)。对于初学者来说,它根本不读取行,它读取 4 个单词,然后尝试读取和解析一个整数。这突出了scanf是多么容易出错 -> 使用一些让自己更难射中自己脚的东西。 -
这看起来不像标准配置文件。通常它是一个
ini文件或xml或json文件用于此目的,并且有许多现成的解决方案来读/写这样的配置。我从未见过您提出的格式,因此可能很难找到现成的解决方案。