2009-08-05 11 views
2

私は以前にこの質問をしましたhereと同様の質問が閉じられました。 SO、他のユーザーからのコメントをもとに、私は私の質問再フレーミングしているファイルからC++の構造体内の構造体の配列を読み取る

:最初の記事で

を、私はINDATA < <を使用してstruct.Byの配列にファイルからTHAデータを読み取るしようとしていましたp [i]であり、>> p.fIdであれば、データファイルからPersonIdに値を読み取ることができました。

は今、私はこれを試してみたい:

struct PersonId 
{ 
    int fId; 
}; 

struct PersonData 
{ 
    public: 
     typedef PersonData* Ptr; 
     PersonData(); 
     PersonId fId; 
     istream& read(std::istream&); 
}; 

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

istream& operator >> (istream& is, PersonData &p) 
{ 
    // is >> p.fId; 
    return p.read(is); 
} 

int main() 
{ 
    ifstream indata; // indata is like cin 
    int i; 
    indata.open("persons.txt", ios::in); // opens the file 

    if(!indata) 
    { // file couldn't be opened 
      cout << "Error: file could not be opened" << endl; 
      exit(1); 
    } 

    int n = 5; 

    PersonData* p; 
    p = (PersonData*) malloc (n * sizeof(PersonData)); 


    while (!indata.eof()) 
    { 
     indata >> p[i]; 
     i++; 
    } 

    for(i = 0; i < n; ++i) 
    { 
     cout << "PersonData [" << i << "] is " << p[i] << endl; 
    } 
    return 0; 
} 

私は実際にPersonDataによって定義された構造体に値を読み取るために、「読み」メンバ関数を使用します。 私の質問:PersonData構造体に格納されてPERSONID構造体の中にファイルからデータを読み取る方法

  1. を??

  2. PersonData [i]を読み込んでいるときに、更新された値を持つ構造化PersonIDがあるはずです。

私の質問は今や明確ですか?

+0

1.コードを3回目に投稿しても、何の質問も表示されません。 2. C++で記述している場合は、mallocを使用しないでください(new演算子をオーバーライドしたり、simillarを実行しない限り)。あなたはp = new Persondata [n]と書くべきです。そして最後に delete [] p; 3. PersonIdのオペレータ>>の実装が見当たらない –

答えて

1

[OK]を、最初のいくつかの不平を言って:-)あなたはあなたが欲しいと言う。あなたはどのように試してみるか書きました。すばらしいです。結果はあなたの期待通りではないと思います。しかし、あなたはあなたが得た結果は何か、なぜあなたはそれに失望しているのかを教えてくれませんでした。あなたのコードを見ると、コンパイルしてはいけません。問題はここにあります:

istream& PersonData::read(std::istream& is) 
{ 
    is >> fId; 
    return is; 
} 

PersonIdタイプにはoperator >>は定義されていません。また、fIdはPersonIdタイプです。私は正しい?あるいは演算子>>がどこかに定義されていて、それをあなたの質問に貼り付けるだけではなかったでしょうか?私のクリスタルボールは不明です。 は私が適切に推測した場合、溶液はデイブ・ギャンブルで与えられます。

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

あなたは「まだPersonDataにアクセスしようとする際にエラーが発生して」書きました。私はこの時点でDaveのクリスタルボールも不明であると思われますが、彼はあなたがどんな問題を抱えているか言うことはできません。どちらもできません。私たちに詳細を提供するか、より良いクリスタルボールを送る必要があります。たぶんあなたは彼の別のアドバイスを見逃していたかもしれません "また、p [i] .fId.fIdを使用するように修正しました。"それは意味し、代わりに

cout << "PersonData [" << i << "] is " << p[i] << endl; 

を書くのあなたは

cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl; 

を書く必要があることも、別の問題がある可能性があります - 時にはあなたがたIStreamを書き、そして時にはあなた - あなたは結果的にstd名前空間のメンバーに言及されていませんstd :: istreamを書いて、std :: endlの代わりにendlを書いてください。Koenigのルックアップがうまくいくかもしれませんが、それはうまくいかないかもしれませんが、std :: prefixを追加すると(もちろんこれが問題ならば)

2

あなたは持っている:

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

欠け、構造体の後PERSONID。

これは、read()内のis >> fIdを正しく動作させるために必要です。

さらに、p [i] .fId.fIdを使用するようにcoutを修正します。

素晴らしい作品です!

今はC++で、mallocは使用せず、新しいものを使用してください。さらに良い方法は、std :: vector <>を使用することです。これによりサイズ変更が行われます。

+1

新しいサイフがあるはずです - Psionic - 質問が策定されていないときに答えました:-) –

+1

@tkpoec、私は何かを解決しようとしていますわからない。そして、はい、私は質問/枠をつけている間につまずいた。私はあなたがすでに批評家のバッジを持っていなければならないと思います:P – vivekv80

+0

@tkopecなぜこんにちは。あなたは番号24を考えています。はい、それはほとんど変ですね。青。ヘレン。スポット。私は一日中続けることができます。 ;) –

関連する問題