2016-01-05 175 views
8

我正在讀取ASCII文本文件。它由每個字段的大小來定義,以字節爲單位。例如。每行由一個字符串組成,10個字節,一個浮點數值爲8個字節,一個整數爲5個字節,依此類推。C++獲取EOL的大小(以字節爲單位)

我的問題是讀出換行字符,它有一個可變大小取決於操作系統(通常爲2個字節用於窗戶和爲Linux 1個字節我相信)。

如何獲取C++中EOL字符的大小?

例如,在python我可以這樣做:

len(os.linesep) 
+4

如果你打開在文本模式下的文件,新行應始終只是''\ n'',無論自然行結局。你真的需要知道本地EOL字符串的大小嗎? – Badministrator

+0

該文件是否保證與您讀取它的代碼運行在同一操作系統下?如果是,只需以文本(非二進制)模式打開文件。 – dxiv

回答

0

我不知道所發生的翻譯,你認爲它是。請看下面的代碼:

ostringstream buf; 
buf<< std::endl; 
string s = buf.str(); 
int i = strlen(s.c_str()); 

在此之後,在Windows上運行,我== 1。因此線定義的性病到底是1個字符。正如其他人所評論的,這是「\ n」字符。

+0

這段代碼是錯誤的,因爲CRT的lib沒有打開'\ N'成'\ r \ N'在內存緩衝區,但它的文件和控制檯這樣做。 –

+0

在這裏你正在展示我遇到的問題。寫入文件/控制檯時,C++會將「\ n」轉換爲特定於操作系統的字符,但不會寫入緩衝區。 – jramm

+0

@jramm我認爲你沒有足夠好地解釋你的問題。當寫入緩衝區時,\ n不需要(事實上不能)編碼。但是,如果將該緩衝區寫入以* text *模式打開的文件中,\ n將自動翻譯爲任何平臺的任務。然後,如果您在_text_模式下打開相同的文件並將其讀回,則換行符將被轉換回爲\ n。所以,至少對我來說,目前還不清楚爲什麼你需要知道磁盤文件中'\ n'的編碼。 – dxiv

1

完成此操作的時間順序是讀一行。

現在,最後的字符應該是\n。剝去它。然後,看看前一個字符。它將是\r或其他東西。如果是\r,請將其剝離。

對於Windows [ASCII]文本文件,沒有任何其他的可能性。

即使文件混合在一起(例如某些行是\r\n,有些只是\n),此功能仍然有效。

你可以暫時做到這一點上幾行,只是要確定你不是在處理一些奇怪的。

之後,你現在知道什麼期望大多數的文件。但是,strip方法是一般可靠的方法。在Windows上,您可以從Unix導入文件(反之亦然)。

+0

只是一個挑剔的問題,但如果不知道行結束符是什麼,就很難「讀取行」。例如,你的配方對'\ r'行終止符失敗,對於在windows-land中已經看到的連續空行保存爲'\ r \ n \ n \ n'。 – dxiv

+1

@dxiv的方法的工作原理對'\ r \ n \ n \ N'(例如'\ r \ n \ n \ N') - 這只是混合模式正如我所提到[連續是非問題。我在20多年以前沒有見過'\ r'唯一的文件[如果有的話,我已經轉換了1000個文件]。許多程序不可讀,因爲它們現在假設[至少]換行符。嘗試DOS類型文件的一個;-)我不認爲即使MS支持他們了。 '\ r'在行的_beginning_(例如捕獲的進度輸出)上有效[作爲非終結符]。我已經看到了更多的是(例如'\ rpgm是做\ rpgm 56%是57%done') –

+0

@CraigEstey - 老同學Mac文件是\僅河參見維基百科:https://en.wikipedia.org/wiki/Newline – user3690202

相關問題