2011-03-05 132 views
3

我只在我的C++所以請保持答案簡單第二季度....輸出void函數爲TXT

我有一個鏈表,類相當混亂的程序和文件I/O 我很很多程序完成,但我不能得到它輸出到.txt 這可能是我的糟糕的編碼佈局,因爲當我寫這個時,輸出滑落了我的腦海。 有問題的功能是:進入一類,並調用函數(display_balance)打印輸出

tag.display_balance(); 

注意,這個函數是一個鏈表(標籤)內。

一切都發布到控制檯就好了。但我不知道如何獲得它保存到.txt 幾個谷歌和論壇搜索沒有顯示我能理解的任何東西。 我想:

ofstream BilloutPut; 
BilloutPut.open("BillingStatements.txt"); 
BilloutPut<< tag.display_balance(); 

這是唯一的辦法,我已經學會了它,因爲它是一個void函數如何輸出到文件中,但沒有工作。如果可能的話,我想避免超載< <函數。爲尋找

+0

你在'display_balance'中使用'cout'嗎?如果是這樣,你可能可以添加一個參數到你的函數中,以獲取'ofstream'參數並打印到那個? – jswolf19 2011-03-05 05:14:11

+0

@jswolf:它應該是一個'ostream&'參數,正如我的答案中所提到的,所以它可以接受'cout'或'ofstream'對象(或者'ostringstream')。 – 2011-03-05 05:17:36

回答

6

如果函數自己的文件I/O,這將是艱難的(這就是爲什麼「關注點分離」的軟件設計原則存在,它顯然是在這裏被侵犯)

-Thanks。重載operator <<將無濟於事,這樣的操作員無法在任何地方放置函數的返回值。

如果您可以修改該函數,讓它接受一個參數,即要寫入的對象ostream(這可以默認爲cout)。

如果您不能修改該功能,但它使用std::cout,則可以使用cout.rdbuf(newbuffer)std::cout與其他目標相關聯來重定向。

如果函數使用一些其他的I/O庫,您可能需要使用freopen甚至dup2重新映射stdout(操作系統標準輸出文件描述符)到另一個目的地。

請注意,任何涉及重定向的技術(即cout.rdbuf,freopendup2)都會在任何多線程程序中造成巨大混亂。這可能不適用於你作爲開始的程序員,但是當你從線程開始時,你需要設計你的I/O函數來使用你想要的任何流,全局解決方案不會削減它。

0

感謝您的回覆,我想即時修改功能,但我不知道如何使用ostream。

空隙LINKD :: display_balance從類(驅動器)(){

ListNode *nodePtr; 
nodePtr = head; 

while (nodePtr){ 
    nodePtr->driver.print_balanceReport(); 
    cout<<endl; 
nodePtr = nodePtr->next; 
} 


void driver::print_balanceReport(){ 
    nBalance=balance; 
    cout<<get_firstName()<<" "; 
    cout<<get_lastName()<<" "; 
    cout<<get_dLicense()<<" "; 
    cout<<get_vLicense()<<" "; 
    cout<<get_nBalance()<<" "; 
    cout<<get_passed()<<" "; 
    cout<<get_differance()<<" ";} 

打印

所以,我會改變空隙成ostream的和把它像一個功能類型??也只是爲了我的知識,我可以遍歷從主要我的鏈表,所以我跳過功能?

+0

我明白了,打開並聲明txt並將其傳遞給函數,然後讀取它。 – kingcong3 2011-03-05 22:19:52