我正在尝试确定在配置文件中读取的最佳方式。这个“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
用户可以通过名称了解他们定义的变量。我想让我的程序只读入实际数字并跳过字符串。我知道我可以通过一种方式来实现这一点,在我的程序中定义了很多字符串,然后让它们保持定位,但显然未使用。有没有办法在跳过字符串时轻松读取数字?
答案 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);