读取作为另一个对象的数据成员的对象C ++

时间:2015-09-28 01:06:28

标签: c++ ofstream

我有一个程序可以创建三个Person对象(名称和地址作为数据成员),然后创建三个Account对象(人员对象,帐号和帐户余额作为数据成员)。然后,它将帐户对象中的数据成员写入文件,然后清除帐户对象。然后,该程序将创建新的帐户对象,并从同一文件中读取其数据成员并将其推送到向量。该向量用于显示数据成员。

我遇到的问题是阅读帐户对象。具体读取帐户对象内的人物对象。我知道人物对象应该是访问其数据成员的唯一对象。我似乎无法让它发挥作用。一切都编译得很好,但是当对象自己进入时会引发异常。

以下是相关代码。我将仅包含两个类的readData方法和整个driver.cpp代码。如果您需要了解更多内容,请与我们联系。

谢谢!

Account.cpp

void Account::readData(ifstream &ifile)
{
    if (ifile.fail() || ifile.bad())
    {
        throw readFileException("Could not read file [account]");
    }
    else 
    {
        ifile >> accountNumber;
        ifile >> accountBalance;
        accountPerson.readData(ifile);
    }
}

Person.cpp

void Person::readData(ifstream &ifile)
{
    if (ifile.fail() || ifile.bad())
    {
        throw readFileException("Could not read file [person]");
    }
    else
    {
        getline(ifile, name);
        getline(ifile, address);
    }
}

Driver.cpp

#include "Driver.h"

using namespace std;

int main()
{

    vector<Account> a;

    Person john("John Stockton", "1 Jazz lane");
    Person karl("Karl Malone", "2 Jazz Ave");
    Person jerry("Jerry Sloan", "3 Jazz Street");

    Account a1(john, 1, 500.00);
    Account a2(karl, 2, 1000.00);
    Account a3(jerry, 3, 1200.00);

    a.push_back(a1);
    a.push_back(a2);
    a.push_back(a3);

    ofstream outFile("accounts.txt");

    for (int i = 0; i < a.size(); i++) //to write account info to accounts.txt
    {
        a[i].writeData(outFile);
    } //end for loop

    outFile.close();  // to close accounts.txt

    a.clear(); // clear vecter of accounts -- size now 0

    ifstream inFile("accounts.txt");

    while (!inFile.eof()) //Loop to read in accounts and push them to vector
    {
        Account b;
        try
        {
            b.readData(inFile);
            a.push_back(b);
        }
        catch (readFileException &e)
        {
            cout << "Error: " << e.getMessage() << endl;
            system("pause");
            exit(1);
        }
    } // end of while loop

    for (int i = 0; i < a.size(); i++)
    {
        a[i].deposit(DEPOSIT_AMNT);
    }//end for loop
    for (int i = 0; i < a.size(); i++)
    {
        a[i].withdraw(WITHDRAW_AMNT);
    }//end for loop

    displayAccounts(a);

    system("pause");
    return 0;
}

void displayAccounts(const vector<Account>& v)
{
    //To display column headings
    cout << fixed << setprecision(PRECISION);
    cout << setw(COLUMN_WIDTH_SHORT) << "Acct #" << setw(COLUMN_WIDTH_LONG)
        << "Name" << setw(COLUMN_WIDTH_LONG) << "Address"
        << setw(COLUMN_WIDTH_LONG) << "Balance" << endl;

    for (int i = 0; i < v.size(); i++)
    {
        Person p; 
        p = v[i].getPerson();

        cout << setw(COLUMN_WIDTH_SHORT) << v[i].getAccountNumber() << setw(COLUMN_WIDTH_LONG)
            << p.getName() << setw(COLUMN_WIDTH_LONG) << p.getAddress()
            << setw(COLUMN_WIDTH_LONG) << v[i].getAccountBalance() << endl;
    }//end for loop
}

accounts.txt文件的写法如下:

1
500
John Stockton
1 Jazz lane
2
1000
Karl Malone
2 Jazz Ave
3
1200
Jerry Sloan
3 Jazz Street

1 个答案:

答案 0 :(得分:1)

您的代码无法正常工作,因为您正在检查输入文件&#34;失败&#34;以错误的方式。你永远不应该使用while (!infile.eof),而是应该随时检查每个输入操作。例如:

if (!(ifile >> accountNumber))

if (!(getline(ifile, name)))

这样您也无需检查bad()fail()。相反,只要运行直到输入操作失败。

有关while循环不起作用的详细信息,请参阅此处:https://stackoverflow.com/a/4533102/4323