2011-06-13 80 views
10

我目前正在試圖實現一個字符串緩衝區的子類,以允許緩衝區爲特定的字符('\ n')進行標記,並採取行動如果發生此字符(在我的情況下,將消息轉儲到記錄器並清除緩衝區)。 爲了實現這個目標,我重寫sputc(實現注意'\ n')和xsputn(確實使用sputc,因爲GCC實現似乎沒有默認這樣做)。 爲了調試的目的,我讓sputc寫出傳遞給它的每個字符到stdout。流緩衝區實現std :: endl和' n'之間的差異

現在,這是我的問題:如果我使用類似

mystream << "Some text" << std::endl; 

sputc接收除了「\ n」應該由標準:: ENDL被引導的每一個字符,因此,預計該行動沒有完成,因爲'\ n'沒有被傳遞。 如果我使用類似

mystream << "Some text" << '\n'; 

甚至

mystream << "Some text" << "\n" << std::flush; 

一切如預期,我的sputc實施得到 '\ n' 字符工作。

所以我的問題是:兩個代碼行不應該完全相同的關於後面的stringbuf,如果不是,我必須重寫哪些其他方法來獲得'\ n'?

+2

'<< std :: endl'確切地說是'<<'\ n'<< std :: flush;'。 – 2011-06-13 13:53:00

+0

有更簡單的方法來做你想做的事情。也許如果你問一個關於真正問題的問題,你可以得到關於解決問題的最佳方法的建議。 – 2011-06-13 16:22:31

回答

6

您無法覆蓋sputc,因爲sputc不是虛擬的。您需要重載overflowsync,並檢查\n發生的整個待處理序列。

你應該不是真的需要重載xsputn除非因爲你知道什麼特殊之處,備份您的數據流類型的設備,你可以做一些優化。

+0

我昨天發現自己和重載溢出,你說,現在一切正常。 – crispinus 2011-06-14 09:39:20