2011-07-28 28 views
5

我們知道,在文件流中插入\n時,系統的適當行尾序列將寫入文件(例如Windows的\r\n)。在std::stringstream中插入一個結束符會導致系統相應的行尾序列被寫入字符串嗎?例如:將端行插入字符串流

#include <sstream> 

int main() 
{ 
    std::ostringstream oss; 
    oss << std::endl; 
    std::string endlineSequence = oss.str(); 
    bool isWindows = enlineSequence == "\r\n"; 
    bool isOldMac = endlineSequence == "\r"; 
    bool isUnix = endlineSequence == "\n"; 
    // Will this work??? 
} 
+1

爲了節省您的時間,您可以執行並查看程序中的所有「布爾」是否爲「true」或非最可能的「isWindows」和「isMac」都將評估爲「false」。 –

+0

@Aditya:我不得不在每個平臺上嘗試。並非每個人都可以使用Windows,Mac和Unix機箱。 :-) –

+0

@Emile:不,你只需要在Windows中試用它。因爲如果你編寫'\ n'並得到'\ r \ n',它會將其翻譯爲本地換行符;如果你得到了'\ n'則它不會。不過,它在Linux或MacOS X中並不明顯。在Windows和Linux計算機上均爲 –

回答

11

特定環境下的行尾僅用於文本文件相關。只要流只在內存中,它只是'\n'

+6

它怎麼可能是字符串流中的單個字符'\ n'?假設翻譯是在字符串流上完成的。想一想'sstream1 <<「\ n」會導致的混亂情況; sstream2 << stream1.str(); ...; std :: cout << sstream99.str();' –

3

簡短回答

龍回答

在文本模式下的文件流將插入一個特定於平臺的ELS到文件中。但是應用程序永遠不會看到這個,因爲當文件被讀取時,ELS被轉換回\n。因此,即使使用文件流(在文本模式下),您也不會看到ELS。

回到std::stringstream。如果代碼確實插入了特定於平臺的ELS(事實上沒有),那麼當您閱讀該流時,如果您將ELS讀回來,您仍然期望看到\n,因爲您期望將ELS轉換回來。這樣做沒有意義。