读入一个对象,该对象是另一个对象 C++ 的数据成员
Reading in an object that is a data member of another object C++
我有一个程序创建三个 Person 对象(名称和地址作为数据成员),然后创建三个 Account 对象(个人对象、帐号和帐户余额作为数据成员)。然后它将帐户对象中的数据成员写入文件,然后清除帐户对象。然后该程序应该创建新的帐户对象并从同一个文件中读取它们的数据成员并将它们推送到一个向量。该向量用于显示数据成员。
我遇到的问题是读取帐户对象。具体阅读帐户对象内的人员对象。我知道 person 对象应该是唯一访问其数据成员的对象。我似乎无法让它工作。一切都可以正常编译,但是当对象读取自身时会抛出异常。
这是相关代码。我将只包含 类 和整个 driver.cpp 代码的 readData 方法。如果您需要查看更多内容,请告诉我。
谢谢!
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
您的代码不起作用,因为您检查输入文件中的 "failure" 的方式有误。你永远不应该使用 while (!infile.eof)
,而是你应该边走边检查每个输入操作。例如:
if (!(ifile >> accountNumber))
if (!(getline(ifile, name)))
这样您也不需要检查 bad()
和 fail()
。相反,只是 运行 直到输入操作失败。
有关 while
循环为何不起作用的更多详细信息,请参阅此处:
我有一个程序创建三个 Person 对象(名称和地址作为数据成员),然后创建三个 Account 对象(个人对象、帐号和帐户余额作为数据成员)。然后它将帐户对象中的数据成员写入文件,然后清除帐户对象。然后该程序应该创建新的帐户对象并从同一个文件中读取它们的数据成员并将它们推送到一个向量。该向量用于显示数据成员。
我遇到的问题是读取帐户对象。具体阅读帐户对象内的人员对象。我知道 person 对象应该是唯一访问其数据成员的对象。我似乎无法让它工作。一切都可以正常编译,但是当对象读取自身时会抛出异常。
这是相关代码。我将只包含 类 和整个 driver.cpp 代码的 readData 方法。如果您需要查看更多内容,请告诉我。
谢谢!
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
您的代码不起作用,因为您检查输入文件中的 "failure" 的方式有误。你永远不应该使用 while (!infile.eof)
,而是你应该边走边检查每个输入操作。例如:
if (!(ifile >> accountNumber))
if (!(getline(ifile, name)))
这样您也不需要检查 bad()
和 fail()
。相反,只是 运行 直到输入操作失败。
有关 while
循环为何不起作用的更多详细信息,请参阅此处: