函式原型:
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是我們資料分析和風控建模中很重要乙個元素,後續的很多資料操作都要以此為基礎。我們的資...