2013-05-06 136 views
0

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

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

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

因此,没有人照顾给我看,我缺少的是什么?这个任务已经完成了,所以如果你愿意,可以随意详细解释它,或者只是发布代码,我可以弄清楚。我有点疯狂,试图了解如何使用此代码打印。 (我的版本工作得很好,但没有做任何这个。)谢谢

回答

1

你的教授代码是错误的,因为它测试eof在错误的地方,它也做了不必要的seekg,我会担心你的教授正在写错误的代码。

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

尝试这些代码与你环教授的版本,你可能会看到为什么它的窃听。

+0

所以我应该把所有的主要?他的坏习惯说,他是在我们的职能中使用cout的坚持者。我从来不明白为什么,但我的问题不在于此,而仅仅是为了做。至于seekg,我有点困惑,为什么它自己在那里,但是当我问到这个问题时,他说它在他的电脑上工作,并将其留在那里。我认为这是因为他不是那些抱怨成绩的人的粉丝,也不是在做家庭作业时做的事情(他们确实倾向于抱怨很多,但主要是因为他们懒得做这项工作)。无论如何,我会放弃这一点,谢谢! – 2013-05-06 05:33:03

+0

下面是一个问题,该文件如何打印?这不仅仅是从地址簿中存储的内容打印,不管文件中有什么内容? – 2013-05-06 05:35:50

+0

''在函数中不使用cout'这是很好的建议。原因是它使功能不够灵活。你应该做什么取决于你的目标。如果你想在你的函数中没有cout的更清晰的代码,那么只需写出正在构建的人员向量即可。 – john 2013-05-06 05:36:00