2011-01-17 35 views
2

私はC++で問題があります。ここの専門家が助けてくれることを願っています。テキストファイルから変数を読み込む

問題は、いくつかの情報がある.txtファイルがあることです。私はこの情報を使用するプログラムを作成したいと思います。

.txtファイルは次のようになります。

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

プログラムは、ファイルから値を読み取るし、それらを使用する必要があり、それを行うにはどのように任意のアイデア!?

/*何をすべきかUPDATE */

は、テキストファイルから数値を読み込み、変数の数値のみ、その後、実際のプログラムでは、これらの値を使用することです。

例えば、変数1の値を読み込んで変数xに入れると、プログラムでは int y = 7 * xと定義することができます。

私はファイルの読み方を知っていますが、わからないのは、変数の特定の値を読み取る方法です。

基本的に、プログラムはファイルを読み込み、変数の名前を認識し、値を取得してから使用する必要があります。

多くのおかげ

+3

あなたの問題は何ですか?まだコードはありますか?それはなぜ失敗ですか? –

+1

より具体的に言えば、変数をファイルに書き込むことは、2行で行うのと同じくらい簡単です! – Sudantha

+0

'.txt'ファイルに関する制約がありますか?自由にフォーマットを変更できますか? – ereOn

答えて

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に保存するだけでも十分かもしれません。しかし、あなたはそれを行います、あなたは "タイプ"というタイプの値を格納するとしましょう。

変数の名前がコロンの左側に指定されているようです。対応する変数がプログラムでハードコードされていることがわかっている場合は、既存の変数を右側の値に設定できます。それ以外の場合は、これらの識別子の名前に動的に関連付けられた変数を作成する必要があります。これは、識別子が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などの言語で、この要件を満たす動作中のプログラム(スローながらも)を取得する方が簡単です。

+0

助けてくれてありがとう – Makoo

2

あなたのプログラムで使用するための情報を保存するために、いくつかの設定のようなファイルが必要なようです。設定ファイルの管理(読み取り、取得、保存、保存)には多くの実装があります。私は小さく、便利に固執するlibconfighttp://www.hyperrealm.com/libconfig/ 整数、浮動小数点、ブール変数、配列、リスト、囲まれたセクションもサポートしています。

+0

これはまさに私が欲しいものです。ありがとうございます。私はこれに取り組んで、私は戻ってきます。 – Makoo

関連する問題