从文本文件中读取变量

时间:2011-01-17 10:38:10

标签: c++ parsing stream configuration-files

我在c ++中遇到问题,我希望这里的一些专家可以帮助我。

问题是,有一个.txt文件,它有一些信息。我想写一个使用这些信息的程序。

.txt文件将是这样的:

variable 1: 711   
variable 2: [8 5 6 11]  
variable 3: xyz zyx yyy

程序应该读取文件中的值,然后使用它们,任何想法怎么做?!!

/ *更新* /

应该做的是从文本文件中读取数值,只读取变量的数值,然后在真实程序中使用这些值。

例如,读取变量1的值并将其放入变量x,然后在我们可能定义的程序中 int y = 7 * x;

我知道如何阅读文件,但我不知道如何阅读变量的具体值。

基本上程序应该读取文件,识别变量的名称,获取值,然后使用它。

非常感谢

2 个答案:

答案 0 :(得分:2)

看起来您希望有一些类似配置的文件来存储您的程序要使用的一些信息。配置文件管理有许多实现(读取,检索,存储,保存)。我坚持小而方便libconfighttp://www.hyperrealm.com/libconfig/ 它还支持整数,浮点和布尔变量,以及数组,列表和封闭部分。

答案 1 :(得分:1)

我认为你的问题暗示变量可能有不同的类型,例如数字,数组或字符串。在这种情况下,您必须决定是使用说boost::any<>还是boost::variant<>,还是创建自己的变量类型ala:

struct Var
{
    enum { Double, String, Array } Type;
    Type type_;

    double double_;
    std::string string_;
    std::vector<double> array_;

    Var(Type t) : type_(t), double_(0) { } // empty double/string/array
    Var(double d) : type_(Double), double_(d) { }
    Var(const std::string& s) : type_(String), string_(s) { }
    ...
};

或者,您可以使用C ++的内置多态,并为每个真实数据类型提供基类和派生类。您甚至可以始终存储文本表示,并将所有内容存储在std::string中。但是,您可以这样做,假设您将值存储在名为“Type”的类型中。

似乎要在冒号的左侧指定变量的名称。如果您知道相应的变量将在您的程序中进行硬编码,那么您可以将这些预先存在的变量设置为右侧的值。否则,您需要动态创建与这些标识符名称关联的变量:这可以使用std::map<std::string, Type>键入标识符来完成。你可以填写它:

std::map<std::string, Type> variables;

variables["age"] = Type(28);
variables["name"] = Type("Fred");

要解析实际的文本文件,可以使用iostreams。一次读一行ala:

std::string line;
while (getline(cin, line))
{
    std::string::pos n = line.find(':');
    if (pos != std::string::npos)
    {
        std::string identifier = line.substr(0, n - 1);
        Type var;
        {
            // try parsing it as a number...
            std::istringstream iss = line.substr(n + 1);
            char c;
            double d;
            if (iss >> d && !(iss >> c))
                var = d;
        }

        {
            // try parsing it as an array...
            std::istringstream iss = line.substr(n + 1);
            var.clear(Array);
            double d;
            if (iss >> c && c == '[')
                while (iss >> d)
                    result.array_.push_back(d);
                if (iss && iss >> c && c == ']' && !(is >> c))
                    // parsed successfully as an array - use "result"
        }
        {
            // it's a string...
            var = line.substr(n + 1);
        }

您应该尝试在此处开始并在遇到困难时寻求具体帮助。

注意:您可能会发现使用Ruby,python或perl等语言更容易获得满足此要求的工作(虽然很慢)。