0

構成ファイルを読み取る最良の方法を決定しようとしています。この「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

名前は、ユーザーが定義している変数を知るためにあります。プログラムに実際の数値のみを読み込み、文字列をスキップさせたいと考えています。プログラムで大量の文字列を定義し、それらを定義済みのままにしておく方法でこれを実行できることはわかっていますが、明らかに使用されていません。文字列をスキップしながら数字を簡単に読み取る方法はありますか?

4

5 に答える 5

4

明らかな解決策の何が問題になっていますか?

string param_name;
int param_value;

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

を必要な場所にparam_name保存しながら、各反復後にを破棄できます。param_value

于 2013-02-26T21:27:38.033 に答える
3

文字列を読み取るときは、どこにも保存しないでください。

std::vector<int> values;
std::string discard;
int value;
while (file >> discard >> value) {
  values.push_back(value);
}
于 2013-02-26T21:28:26.583 に答える
2

文字列を無視し、関心のあるデータのみを読み取るために、ctypeファセットを投稿するのが遅れているに違いないと思います。

#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;
}

このようにして、無関係なデータは実際にそして本当に無視されます-ストリームにファセットを埋め込んだ後は、文字列がまったく存在しないかのようになります。

于 2013-02-26T23:12:32.267 に答える
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);
}

文字列を読み取って使用しない代わりに、無視を使用します。

于 2013-02-26T21:39:44.693 に答える
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);
于 2013-02-26T22:31:30.943 に答える