从配置文件中读取变量

时间:2013-02-26 21:22:46

标签: c++

我正在尝试确定在配置文件中读取的最佳方式。这个“Parameters.cfg”文件只是用于定义值,并且具有以下形式:

origin_uniform_distribution 0
origin_defined 1
angles_gaussian 0
angles_uniform_distribution 0
angles_defined 0
startx 0
starty 0
gap 500
nevents 1000
origin_uniform_distribution_x_min -5
origin_uniform_distribution_x_max 5
origin_uniform_distribution_y_min -5
origin_uniform_distribution_y_max 5
origin_defined_x 0
origin_defined_y 0
angles_gaussian_center 0
angles_gaussian_sigma 5
angles_uniform_distribution_x_min -5
angles_uniform_distribution_x_max 5
angles_uniform_distribution_y_min -5
angles_uniform_distribution_y_max 5
angles_defined_x 10
angles_defined_y 10

用户可以通过名称了解他们定义的变量。我想让我的程序只读入实际数字并跳过字符串。我知道我可以通过一种方式来实现这一点,在我的程序中定义了很多字符串,然后让它们保持定位,但显然未使用。有没有办法在跳过字符串时轻松读取数字?

5 个答案:

答案 0 :(得分:4)

明显的解决方案有什么问题?

string param_name;
int param_value;

while ( fin >> param_name >> param_value )
{
  ..
}

您可以在每次迭代后丢弃param_name,同时将param_value存储在您需要的任何位置。

答案 1 :(得分:3)

当你读出字符串时,不要将它们存储在任何地方:

std::vector<int> values;
std::string discard;
int value;
while (file >> discard >> value) {
  values.push_back(value);
}

答案 2 :(得分:2)

我想我必须过时发布ctype facet来忽略字符串并只读取我们关心的数据:

#include <locale>
#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

struct number_only: std::ctype<char> { 
    number_only() : std::ctype<char>(get_table()) {} 

    static mask const *get_table() { 
        static std::vector<mask> rc(table_size, space);

        std::fill_n(&rc['0'], 10, digit);
        rc['-'] = punct;
        return &rc[0]; 
    } 
};

int main() { 
    // open the file
    std::ifstream x("config.txt");

    // have the file use our ctype facet:
    x.imbue(std::locale(std::locale(), new number_only));

    // initialize vector from the numbers in the file:
    std::vector<int> numbers((std::istream_iterator<int>(x)), 
                              std::istream_iterator<int>());

    // display what we read:
    std::copy(numbers.begin(), numbers.end(), 
        std::ostream_iterator<int>(std::cout, "\n"));

    return 0;
}

这样无关的数据确实被忽略了 - 在用我们的方面填充流后,就好像字符串根本不存在一样。

答案 3 :(得分:1)

此方法不会存储字符串(就像问题中要求的那样):

static const std::streamsize max = std::numeric_limits<std::streamsize>::max();
std::vector<int> values;
int value;

while(file.ignore(max, ' ') >> file >> value)
{
    values.push_back(value);
}

它使用ignore而不是读取字符串而不使用它。

答案 4 :(得分:0)

您可以定义一个结构,然后为其重载istream operator>>

struct ParameterDiscardingName {
    int value;
    operator int() const {
        return value;
    }
};
istream& operator>>(istream& is, ParameterDiscardingName& param) {
    std::string discard;
    return is >> discard >> param.value;
}

ifstream file("Parameters.cfg");
istream_iterator<ParameterDiscardingName> begin(file), end;
vector<int> parameters(begin, end);