2012-03-15 15 views
1

クラス 'Complex'のオブジェクトを格納するベクトルを取得しようとしています。ベクトル、ポインタ、クラス、EoFループ(C++)

これは私が店にそれを得ることを試みた方法です:私はこのループにCOUTを置く(これは私のプログラムで情報を読みますが

ifstream values; 
values.open("h://values.txt"); 

if(!values) 
{ 
    cout<<"Error: cannot open "<<"values.txt"<<endl<<endl; 
} 
else 
{ 

    //Initialise list 
    vector<Complex> v; 
    Complex *c1; 

    double a,b,d=0,e=0; 
    char c; 

    int count=0;  



    while(values) 
    { 
     values>>c>>a>>b; 
     c1=new Complex; 

     v.push_back(*c1); 

     cout<<c<<" "<<a<<" "<<b<<endl; 


     switch (c) 
      { 
       case 'r': 
       case 'R': 
       case 'p': 
       case 'P': 
        { 
         //Call constructor 

         v[count].setType(c); 


         switch (c) 
         { 
          case 'r': 
          case 'R': 
           { v[count].setReal(a); 
            v[count].setImaginary(b); 
            v[count].topolar(a,b,d,e); 
            break; 
           } 
          case 'p': 
          case'P': 
           { v[count].setLength(a); 
            v[count].setAngle(b); 
            v[count].frompolar(d,e,a,b); 
            break; 
           } 
          default: 
           { cout<<"Type Error"<<endl; 
            break; 
           } 
         } 

         count++; 
         break; 
        } 

       default: 
        { 
         //error message 
         cout<<" Failed input type, ensure all of type 'r' or 'p'"<< endl; 
         cout<<"Programme Closing"<<endl; 
         break; 
        } 


      }; 
    } 

、それは二回最後の行を読んで主張どの数字がどこにあるのかがわかりやすくなりました)。私はforループを使用しようとしましたが、ファイルの最後まで実行したいので、whileループを使用する必要があると思いますが、間違っている可能性があります。

私の監督は、すべてのループで上書きされるc1の行に何かがあると言いましたが、情報がベクトルに渡されてから次の行に上書きされるのでOKです。混乱している。

次の問題は、上記のループの外側で(たとえば印刷前に操作できるように)、すべての情報をもう一度試してみると、forループが到達するまで何度も何度も同じことを表示することです数...場合

int y; 
int z; 
while(y!=3) 
{ 
    cout<< " What would you like to do?"<<endl; 
    cout<< " Type the number of the option you would like"<<endl; 
    cout<< " 1. Show all numbers in polar form"<<endl; 
    cout<< " 2. Show all numbers in rectangular form"<<endl; 
    cout<< " 3. Show all numbers in both forms"<<endl; 
    cout<< " 4. Convert a number to its conjugate"<<endl; 
    cout<< " 5. Exit"<<endl; 
    cin>>y; 

    switch(y) 
    { 
    case 1: 
     for(z=0; z<count;z++) 
     { 
      v[z].getLength(); 
      v[z].getAngle(); 
     cout<< a<<" "<<b<<endl;}; 
     break; 

    case 2: 
     for (z=0; z!=count;z++) 
     { 
      v[z].getReal(); 
      v[z].getImaginary(); 


     }; 
     break; 

    case 3: 
     cout<<" Real Imaginary  | Length Angle | Original Type"<<endl; 

     for(z=0; z!=count;z++) 
     { v[z].getLength(); 
      v[z].getAngle(); 
         v[z].getReal(); 
        v[z].getImaginary(); 
         cout<<a<<"  "<<b<<"  "<<d<<"  "<<e<<endl; 

あなたの任意のプログラムを実行しよう:

#include "Class definitions.h" 
#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string.h> 
#include <cmath> 
#include <vector> 
using namespace std; 

すべてのヘルプは大歓迎されます!

ありがとうございました! H入力が成功したかどうかX

答えて

0

のみではない前に、入力後が知られています。その後、入力が失敗した場合でも(たとえばファイルの終わりのため)、値を使用します。 whileループの状態にテストを入れてください:

while (values >> c >> a >> b) 

あなたのコードは動作するはずです。 (これが問題を処理する最善の方法であるかどうかはもう一つの質問です。私はおそらくstd::getline()を使用して、std::istringstreamの行を解析します)。

+0

ありがとうございました。今、私はちょうど関数を取得して、coutの正しい情報を返すようにしなければなりません。関数aの中でvとzを長さ/角度などにリセットするといいでしょう。メインプログラム、またはそれを行うには良い方法はありますか? –

関連する問題