2013-05-06 113 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