文件IO打印到屏幕

时间:2013-05-06 03:45:32

标签: c++ file-io printing

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

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,但没有做到这一点。)谢谢

1 个答案:

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

尝试使用教授的循环版本的代码,你可能会看到为什么它被窃听。