linux c getline讀取文字檔案

2021-06-23 00:23:55 字數 2135 閱讀 5136

函式原型:

istream& getline ( istream& is, string& str, char delim );

istream& getline ( istream& is, string& str );

讀取檔案,第乙個按引數delim作為分隔符,第二個以'\n'作為分隔符。

問題產生:

在windows,新建文字文件,輸入字元,換行儲存,另存時選擇檔案編碼為 unicode big endian.

在用上面第二個函式讀取該文字的時候,會忽略掉第一行的字元。

文字示例:(三個逗號,windows平台下另存檔案,選擇編碼:unicode big endian)

,

,,

程式示例

#include #include using namespace std;

int main()

return 0;

}

期望輸出:

2c00

2c00

2c00

實際輸出:

fffe

2c00

2c00

如果直接在linux下,touch 建立乙個文字,同樣的輸入3行逗號。

執行如上命令。

實際輸出:

002c

002c

002c

問題原因:

用 hexdump -c 命令檢視編碼為unicode big endian的檔案:

00000000  fe ff 00 2c 00 0d 00 0a  00 2c 00 0d 00 0a 00 2c  |...,.....,.....,|

00000010

發現檔案頭多了 fe ff 兩個位元組。

同樣,檢視在linux下用touch建立的檔案:

00000000  2c 0a 2c 0a 2c 0a                                 |,.,.,.|

00000006

而用file檢視兩個檔案的格式,如下:

unicode big endian的檔案:

unicode_big_endian.txt: big-endian utf-16 unicode character data, with crlf line terminators

linux touch產生的檔案:

unicode_big_endian.txt_bak1: ascii text

問題解決:

其實這只是個文字編碼的問題。

在windows下,檔案儲存的編碼有四種,分別是:ansi、unicode、unicode big endian、utf-8。

預設為ansi編碼,即系統的預設編碼。(在區域與語言塊設定)。

根據位元組流的bom(byte order mark)規則,在一段位元組流開始時,需要傳送該位元組流的編碼方式,

utf-8:	ef bb bf

utf-16: ff fe

utf-16 big-endian: fe ff

utf-32 big-endian: ff fe 00 00

utf-32 little-endian: 00 00 fe ff

如果上面都不是,則為ansi編碼

在windows下儲存檔案時,選擇了格式unicode big endian的編碼方式,所以檔案頭寫上了utf-16 big-endian的表示fe ff標誌。

而linux 下touch建立的檔案是ascii編碼方式,所以開頭無任何標誌。

所以在檔案編碼不是預設編碼時,應注意檔案開頭的位元組。

如果按行讀取該檔案,應注意在第一行加乙個空行,保證忽略該檔案的編碼方式的標誌。

C 讀取 讀取XML

讀取xml到listbox combobox 1,知識需求 1 訪問xml檔案的兩個基本模型 一,dom模型 使用dom的好處在於它允許編輯和更新xml文件,可以隨機訪問文件中的資料,可以使用xpath查詢,但是,dom的缺點在於它需要一次性的載入整個文件到記憶體中,對於大型的文件,這會造成資源問題...

讀取excel PySpark讀取Excel

日常工作中,客戶通過excel提供資料是一種很常見的方式,既然碰到了就得解決。我常用的辦法就是pandas讀取,並儲存為parquet,如果只讀取乙個sheet,import pandas as pddf pd.read excel excel1.xlsx df.to parquet excel e...

中讀取資料 讀取資料

對資料庫有一定了解的同學應該都知道資料表這個東西。資料表一般是以行列來儲存和展示資料的。每一列就是乙個資料字段,代表每一行資料的屬性。在python裡面也有類似表概念的東西,叫做dataframe。dataframe是我們資料分析和風控建模中很重要乙個元素,後續的很多資料操作都要以此為基礎。我們的資...