所以我的老师给了我们几周前我们实验室的解决方案,它与我提交作业时使用的实验室不同。我将这段代码弹出到我的地址簿程序中,但没有打印出来,我想知道是否有人知道如何将其打印到主屏幕上。我尝试过一些东西,但我能做的最好的事情就是让一个条目打印出来而不是别的。下面是我们给出的代码:
void addressBook::showAll2(string fName)
{
PERSON p;
PEOPLE2 tp;
ifstream inData(fName.c_str(), ios::in);
if(inData.fail())
throw AddressBookException("Cannot open file to read ");
people.clear();
int i = 0;
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
people.push_back(p);
i++;
}
inData.close();
return;
}
我唯一改变的是throw异常,(我们当前的项目)。这曾经是一个bool函数,它会返回true或false。我们没有给出主要的代码形式,因为他不关心那部分,所以我们很少得到它。我只是想知道是否有人知道如何将其打印到屏幕上。我已经尝试将其更改为:
void addressBook::showAll2(string fName, string &str)
{
PERSON p;
PEOPLE2 tp;
ifstream inData(fName.c_str(), ios::in);
if(inData.fail())
throw AddressBookException("Cannot open file to read ");
people.clear();
int i = 0;
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
people.push_back(p);
i++;
inData >> str;
}
inData.close();
return;
}
主要是我有这个:
void printFile() //prints stored file info to screen
{
string str;
addressBook *newBook = addressBook::newbookInst();
Menu *m = Menu::menuInst();
try
{
newBook->showAll2("addressbook", str);
cout << str << '/n' << endl;
}
catch(exception e)
{
cerr << e.what();
}
m->waitKey();
}
所以有人关心向我展示我所缺少的东西吗?作业已经完成,所以如果您愿意,可以随意详细解释,或者只是发布代码,我可以搞清楚。我试着理解如何使用此代码进行打印,我有点疯狂。 (我的版本工作得很好btw,但没有做到这一点。)谢谢
答案 0 :(得分:1)
你的教授代码是错误的,因为它在错误的地方测试eof,它也做了不必要的搜索,我担心你的教授正在编写错误的代码。
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
...
}
应该像这样写
for (;;)
{
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
if (inDate.eof())
break;
...
}
您应该在 之前 之前测试eof 。在新手中这是一个非常常见的错误,但这不是你的教授应该犯的错误。其次,不需要搜索,因为您只是从头到尾浏览文件。这不是一个错误,但没有必要。
inData.close
也是不必要的,因为ifstream析构函数会为你关闭文件。
回答你的问题就是这个
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
cout << p.fName << ' ' << p.lName << ' ' << pAddress << '\n';
尝试使用教授的循环版本的代码,你可能会看到为什么它被窃听。