我希望能够在C / C ++中执行以下操作(如果可能的话)。
我有一个这样的文件:
Initialvariables.txt 的
a = 5
b = 2
c = 8
代码看起来像这样:
int main(int argc char *argv[])
{
int a;
int b;
int c;
LoadInitialVariables("Initialvariables.txt");
}
其中a,b,c是变量,文件“Initialvariables.txt”包含编译后可以更改的初始值。
是否可以创建LoadInitialVariables,如果a新人来改变代码,他们可以简单地添加一个新的int并在“initialvariables.txt”中添加一个新行,代码将完成其余的工作以设置初始变量?
目的不是要使用硬编码的钩子,而是使LoadInitialVariables尽可能通用。
对我来说困难似乎来自编译器剥离符号的事实,因此可执行文件将不知道a,b,c等是没有适当的钩子。如果可能的话,我宁愿不必指定钩子(除非它只是装饰int)。
答案 0 :(得分:2)
为什么不使用std::map<string, int>
?
答案 1 :(得分:2)
您可以LoadInitialVariables()
将文本文件加载到std::map<std::string, int>
,然后您可以根据需要按名称引用int
值,例如:
void LoadInitialVariables(const std::string &fileName, std::map<std::string, int> &variables)
{
variables.clear();
char name[256];
int value;
for (each line in the file)
{
std::string line = ...;
if (sscanf(line.c_str(), "%s = %d", name, &value) == 2)
variables[name] = value;
}
...
}
int main(int argc char *argv[])
{
std::map<std::string, int> variables;
LoadInitialVariables("Initialvariables.txt", variables);
int a = variables["a"];
int b = variables["b"];
int c = variables["c"];
...
}
答案 2 :(得分:1)
是否可以创建LoadInitialVariables,这样如果有新人来改变代码,他们可以简单地添加一个新的int并添加一个新行到&#34; initialvariables.txt&#34;并且代码将完成剩下的工作以设置初始变量?
没有
但是构建一个支持层并不是非常困难,程序员可以使用该支持层注册变量,然后由文件解析器设置。最简单的方法是VBRonPaulFan suggests的c ++ std::map<std::string, int>
。在c中你必须编写更多的代码,但它仍然可以在几十行中完成(如果你只需要支持一种类型:几百种来支持一组合理但固定的类型)。
答案 3 :(得分:0)
您要求reflection吗?它在C ++中不可用,至少不是开箱即用的。你总是可以做一些可怕的C风格的宏......
#define READ_FROM_FILE(X) X = some_function_that_greps_file_for(#X)
int a, b, c;
READ_FROM_FILE(a);
READ_FROM_FILE(b);
READ_FROM_FILE(c);
但使用map<string, int>
会更容易,更安全,更易于维护。