我有一个程序可以创建三个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
答案 0 :(得分:1)
您的代码无法正常工作,因为您正在检查输入文件&#34;失败&#34;以错误的方式。你永远不应该使用while (!infile.eof)
,而是应该随时检查每个输入操作。例如:
if (!(ifile >> accountNumber))
if (!(getline(ifile, name)))
这样您也无需检查bad()
和fail()
。相反,只要运行直到输入操作失败。
有关while
循环不起作用的详细信息,请参阅此处:https://stackoverflow.com/a/4533102/4323