2012-03-15 79 views
1

我想获得一个矢量来存储类'复杂'类的对象。向量,指针,类和EoF循环(C++)

这是我曾试图把它存储:

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


      }; 
    } 

虽然这会阅读我在程序的信息,它坚持阅读的最后一行两次(我把COUT到这个循环,使很容易看到哪些数字在哪里)。我曾尝试使用for循环,但因为我希望它运行到文件结尾,所以我认为我必须使用while循环,但我可能是错误的。

我的主管在每条循环中都会覆盖c1的内容,但我认为这应该是正确的,因为信息在被下一行覆盖之前被传递给向量,所以我有点困惑。

接下来的问题是,当我再次尝试并在上面显示的循环之外打印出所有信息(例如为了在打印之前允许进行操作),它一遍又一遍地打印相同的东西,直到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

是否输入成功仅知道的输入,而不是之前。你做

values>>c>>a>>b; 

后您使用的值,即使输入失败(例如,由于文件结束)。将测试置于while循环的条件下:

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

和您的代码应该工作。 (这是否是解决问题的最佳方法是另一个问题,我可能会使用std::getline(),然后是std::istringstream来解析我读的行,更容易的错误恢复。)

+0

感谢这是第一位,现在我只需要弄清楚如何让我的函数返回cout的正确信息,最好是让a和b在函数nd中重置为v [z]长度/角度等,然后在主程序还是有更好的方法来做到这一点? – 2012-03-22 11:39:51