2011-07-28 40 views
8

如何確定C++中的環境換行?谷歌爲C#和.NET產生了許多結果,但我沒有看到任何方式爲非CLI C++做。確定正在編譯C++程序的環境換行字符

附加信息:我需要掃描一個const char*作爲角色。

通過 「環境換行」 我的意思是\r\n在Windows上,\n在Linux上,並\r在Mac上。

+3

爲什麼輸出「本地」換行符甚至是必要的?我希望人們停止污染世界,給人的印象是「\ r \ n」是Windows上的換行符。幾乎每個窗口上的文本編輯器都會處理「\ n」。我聽說過的唯一反例就是記事本! –

+0

這個問題使我產生了另一種:http://stackoverflow.com/questions/6865398/inserting-endline-into-a-stringstream –

+0

@Andre誰說輸出任何東西? –

回答

6

std::endl插入適合系統的換行符。您可以使用 ostringstream在運行時將換行符序列確定爲字符串。

#include <sstream> 

int main() 
{ 
    std::ostringstream oss; 
    oss << std::endl; 
    std::string thisIsEnvironmentNewline = oss.str(); 
} 

編輯:*明白爲什麼這個可能不會運行下面的評論。


如果你知道你的平臺將被限制到Windows,Mac和Unix的,那麼你可以使用預定義的編譯器宏(listed here),以確定在編譯時的底線序列:

#ifdef _WIN32 
    #define NEWLINE "\r\n" 
#elif defined macintosh // OS 9 
    #define NEWLINE "\r" 
#else 
    #define NEWLINE "\n" // Mac OS X uses \n 
#endif 

大多數非Windows和非Apple平臺都是使用\n的某種Unix變體,因此上述宏應該可以在許多平臺上使用。唉,我不知道在編譯時爲所有可能的平臺確定端點序列的可移植方式。

+0

這是唯一的方法嗎?我寧願在編譯時做它。 –

+0

@Seth:爲什麼在編譯時需要知道換行符的類型? –

+1

@Remy,因爲它在運行時不需要計算:)我可能不得不爲此解決。 –

1

一般用#define。但是,對於簡單的應用程序,以「文本模式」打開文件將爲您提供所需的內容。

4

對於C++(和C)中的格式化文本IO,新行字符始終爲'\n'。如果您想知道給定平臺和文件模式的新行的二進制表示形式,請以所需的模式(例如文本或二進制文件,UTF-8,UTF-16,MCBS等)打開文件,寫出'\n',關閉它,以二進制重新打開它,讀入整個文件,並找出'\n'的實際二進制編碼。您也可能需要考慮end-of-file角色。

+0

這適用於具有面向流的文件(如Unix,DOS和Windows)的系統,但不適用於面向記錄的文件(如VMS)。對於某些系統,行尾指示根本不作爲字符序列存儲。 –

+0

@Rob,當然,但誰使用VMS了? :)(j/k) – MSN

+0

更嚴重的是,VMS中的_question_更有意義嗎? – MSalters