2012-12-30 61 views
0

我試圖序列化我的哈夫曼樹到一個文件,但有問題的遞歸性問題。我沒有麻煩打印到控制檯使用cout,但當我嘗試將其存儲在字符串中或寫入文件時出現分段錯誤。通過引用遞歸函數傳遞字符串或流對象時C++ segfault

string putData(Node *n, string &s) { 

    if (n->leaf()) { 
    s << "[" << n->value() << "]"; 
    } else { 
    s << "."; 
    } 

    if (n->left()) 
    putData(n->left(), s); 

    if (n->right()) 
    putData(n->right(), s); 

} 

這與流媒體對象是同一個問題。其實,在程序段錯誤之後,我檢查了這個文件,其內容是否正確。但爲什麼最後會出現分割?如何停止該程序的分割?

string putData(Node *n, ofstream &s) { 

    s.open("huffout.txt", ios::app); 

    if (n->leaf()) { 
    s << "[" << n->value() << "]"; 
    } else { 
    s << "."; 
    } 
    s.close() 
    if (n->left()) 
    putData(n->left(), s); 

    if (n->right()) 
    putData(n->right(), s); 

} 
+2

你是如何將一個'ofstream&'傳遞給'string&'的東西? – chris

+1

您可能需要付出更多努力來自行調試。您是否確定了該程序崩潰的具體內容?你用過gdb來檢查那個時候的變量嗎?您能否發佈展示問題的最簡單的完整程序?如果您經歷回答這些問題的過程,您可能會自己找到解決方案。 –

回答

3

你的函數聲明爲返回string但沒有return語句,如果有什麼看,可能會導致一個段錯誤的返回值。您的編譯器應該已經警告過您缺少的回報,是不是編譯時帶有警告?

此外,第一個代碼示例使用string,但試圖附加到operator<<,可能這只是一個副本'n'paste錯誤。

+0

令人驚訝的是,任何人都可能錯過返回類型。所以,我永遠不會失敗,幫助我愚弄自己。謝謝! –

+1

@ user1479360,有編譯器警告。打開它們。 – chris