0

所以我的老师给了我们几周前的一个实验室的解决方案,它与我提交作业时使用的不同。我将此代码弹出到我的地址簿程序中,但没有打印出来,我想知道是否有人知道如何将它从 main.js 打印到屏幕上。我已经尝试了一些东西,但我能做的最好的事情就是打印一个条目,而不是别的。这是我们得到的代码:

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; 
}

我唯一改变的是抛出异常,(我们当前的项目)。这曾经是一个布尔函数,它会返回真或假。我们没有得到 main 形式的代码,因为他不关心那部分,所以我们很少得到它。我只是想知道是否有人知道如何将其打印到屏幕上。我试过把它改成这样:

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();
 }

那么有人愿意告诉我我缺少什么吗?作业已经完成,如果您愿意,请随时详细解释,或者只是发布代码,我可以弄清楚。我有点疯狂地试图理解我是如何用这段代码打印出来的。(顺便说一句,我的版本工作得很好,但没有做任何这些。)谢谢

4

1 回答 1

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而不是之前。这是新手中很常见的错误,但这不是你的教授应该犯的错误。其次,不需要 seekg,因为您只是从头到尾浏览文件。这不是错误,但没有必要。

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';

用你教授的循环版本试试那个代码,你可能会明白为什么它被窃听了。

于 2013-05-06T04:59:04.367 回答