Векторы, указатели, классы и циклы EoF (C ++) - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь получить вектор для хранения объектов класса Complex.

Вот как я пытался получить его для хранения:

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;

Любая помощь будет принята с благодарностью !!

Большое спасибо!В х

1 Ответ

0 голосов
/ 15 марта 2012

Успешность ввода известна только после ввода, но не раньше.После того, как вы выполните

values>>c>>a>>b;

, вы используете значения, даже если ввод не удался (например, из-за конца файла).Поместите тест в состояние цикла while:

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

, и ваш код должен работать.(Является ли это лучшим способом решения проблемы - это другой вопрос. Я бы, вероятно, использовал std::getline(), а затем std::istringstream для разбора строки, которую я прочел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...