文件IO打印到屏幕

File IO Printing to screen

本文关键字:屏幕 打印 IO 文件      更新时间:2023-10-16

我的老师给了我们几周前的一个实验的答案,它和我提交作业时使用的不一样。我将这段代码弹出到我的地址簿程序中,但是没有打印出来,我想知道是否有人知道如何从主界面将这段代码打印到屏幕上。我尝试了一些方法,但我能做的最好的是打印出一个条目,而不是其他条目。下面是我们得到的代码:

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

我唯一改变的是抛出异常(我们当前的项目)。这曾经是一个bool函数,它会返回真或假。我们没有得到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; 
}

在main中我有这个:

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

有没有人愿意告诉我我错过了什么?作业已经完成了,所以如果你愿意,可以详细解释一下,或者直接写邮政编码,我就能算出来了。我有点疯狂了,我想弄明白我是怎么把这段代码打印出来的。(顺便说一句,我的版本工作得很好,但没有做任何这些。)由于

你的教授的代码是错误的,因为它在错误的地方测试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,因为您只是从头到尾遍历文件。这不是bug,但也没必要。

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

用你教授的循环版本试试这段代码,你可能就会明白为什么会有bug了。