2016-08-01 6 views
0

このプロジェクトをコーディングして概念化するのに問題があります。割り当てられました。私はこの問題の答えを見回しましたが、運がほとんどないため、本当に明らかです。特定の単語をファイルから読み込んでオブジェクトに格納する

動物:私は、ファイルは次の形式を持っていると仮定され、ファイル名にユーザを促すことになってる

名:[値]

ノイズ:[値]

脚:[値](間にスペースなし)

それらをファイルにと同数の「動物のオブジェクトを」読み込みおよび格納することができるはずです3つのパラメータ(名前、ノイズ、脚)を持つ動物オブジェクトクラスです。

私の問題は主にファイルの読み込み中ですが、ファイルを読み込んで情報を保存するための良い方法を見つけられません。ここに私は現在持っているコードです。私が現在持っているコードの助けと値を格納するためのアイデア。申し訳ありませんが、私が何かを不十分に説明した場合は、私がしたかどうかを明確にするように依頼してください、事前に感謝します。あなたが本当にこのファイル形式にバインドさしている場合

cout << "Enter the file name: "; 
    string fileName; 
    getline(cin, fileName); 
    cout << endl; 
    try 
    { 
     ifstream animalFile(fileName); 
     if (!animalFile.good()) // if it's no good, let the user know and let the loop continue to try again 
     { 
      cout << "There was a problem with the file " << fileName << endl << endl; 
      continue; 
     } 

     string line; 
     while (animalFile >> line) // To get you all the lines. 
     { 
      getline(animalFile, line); // Saves the line in STRING. 
      cout << line << endl; // Prints our STRING. 
     } 

    } 
    catch (...) 
    { 
     cout << "There was a problem with the file " << fileName << endl << endl; 
    } 
+0

この場合、車輪を再発明するのは本当に賢明ですか? xml、json、yamlなどの既存のライブラリを使用することを検討してください – alexeykuzmin0

答えて

0

、それをデータを読み込みおよび格納するために、次のことを検討:

#1。動物を表すクラスAnimalを定義する:

struct Animal 
{ 
    std::string name; 
    int legs; 
    int noise; 
} 

#2 istream& operator >> (istream&, Animal&)を定義して、このタイプの1つのオブジェクトを読み取り、入力の正確性をチェックします。

std::istream& operator >> (std::istream& lhs, Animal& rhs) 
{ 
    std::string buf; 
    lhs >> buf >> buf >> rhs.name >> buf >> rhs.noise >> buf >> rhs.legs; 
} 

#3。 std::vectorにファイルからのすべての値を読み取るためにstd::copystd::istream_iteratorを使用:

std::istream_iterator<Animal> eos; 
std::istream_iterator<Animal> bos(animalFile); 
std::vector<Animal> zoo; 
std::copy(bos, eos, std::back_inserter(zoo)); 

このコードは簡単istream& operator >> (istream&, Animal&)に添加することができる入力エラーのためのチェックを、有していません。

+0

ありがとうございます。したがって、明確にするために、#2はファイルを読み込んでフォーマットをチェックするだけです。 #3の場合でも、どのコード行が何をしているのか、私はそれを完全に把握するのに苦労しています。 – Roberto

+0

@Roberto#2は実際にデータを読み込み、出力引数 'rhs'に格納することでデータを返します。この演算子は次のように使用できます: 'Animal a; cin >> a; '。 – alexeykuzmin0

+0

#3: 'std :: vector'は' Animal'sの動的配列です。 'istream_iterator 'は 'istream'のイテレータです。逆参照では、 'istream'の' T'型の次の要素に進む際に 'operator ::'によって与えられた 'istream'から読み込まれた' T'型の値を返します。引数なしで構築された 'istream_iterator'は" end of stream iterator "です - それはストリームの終わりに達するまで間違った状態を持ち、(' operator == 'に関して)' istream_iterator'拡張と等価です。 'std :: back_inserter'は' std :: back_intert_iterator'です。これは 'push_back()'が割り当てられたときに行います。 – alexeykuzmin0

関連する問題