計算機在最初只支援ascii編碼,但是後來為了支援其他語言中的字元(比如漢字)以及一些特殊字元(比如€),就引入了unicode字符集。基於unicode字符集的編碼方式有很多,比如utf-7、utf-8、unicode以及utf-32。在windows作業系統中,乙個文字檔案的前幾個位元組是用來指定該檔案的編碼方式的。
如果你使用notepad或wordpad來開啟乙個文字檔案,你並不用擔心該檔案的編碼方式,因為這些應用程式會先讀取檔案的前幾個位元組來確定該檔案的編碼方式,然後用正確的編碼將文字中的每個字元顯示出來。下面的圖中,可以看到當用notepad記事本儲存乙個文件時,可以選擇的編碼(encoding)方式有哪些。
用.net讀取文字檔案或寫入文字檔案,你都不須要擔心編碼方式。.net已經將這些封裝好了。在讀取乙個文字檔案的時候,如果你已經知道文字使用的是什麼編碼方式,你可以指定使用哪種編碼方式讀取文字,否則如果不指定編碼方式,.net會讀取文字的前幾個位元組來確定使用哪種編碼方式讀取檔案內容的。在寫入文字檔案的時候,你也可以指定你想使用的編碼方式。如果你沒有指定編碼,.net會根據寫入的文字是否含有特殊字元來決定編碼方式。如果沒有特殊字元,就採用ascii編碼,如果有特殊字元,就採用utf-8編碼。
(一) 讀取檔案
如果你要讀取的檔案內容不是很多,可以使用 file.readalltext(filepath) 或指定編碼方式 file.readalltext(filepath, encoding)的方法。
它們都一次將文字內容全部讀完,並返回乙個包含全部文字內容的字串
string str = file.readalltext(@"c:\temp\ascii.txt");
// 也可以指定編碼方式
string str2 = file.readalltext(@"c:\temp\ascii.txt", encoding.ascii);
也可以使用方法file.readalllines。該方法返回乙個字串陣列。每一行都是乙個陣列元素。
string strs = file.readalllines(@"c:\temp\ascii.txt");
// 也可以指定編碼方式
string strs2 = file.readalllines(@"c:\temp\ascii.txt", encoding.ascii);
當文字的內容比較大時,我們就不要將文字內容一次讀完,而應該採用流(stream)的方式來讀取內容。.net為我們封裝了streamreader類。初始化streamreader類有很多種方式。下面我羅列出幾種
streamreader sr1 = new streamreader(@"c:\temp\utf-8.txt");
// 同樣也可以指定編碼方式
streamreader sr2 = new streamreader(@"c:\temp\utf-8.txt", encoding.utf8);
filestream fs = new filestream(@"c:\temp\utf-8.txt", filemode.open, fileaccess.read, fileshare.none);
streamreader sr3 = new streamreader(fs);
streamreader sr4 = new streamreader(fs, encoding.utf8);
fileinfo myfile = new fileinfo(@"c:\temp\utf-8.txt");
// opentext 建立乙個utf-8 編碼的streamreader物件
streamreader sr5 = myfile.opentext();
// opentext 建立乙個utf-8 編碼的streamreader物件
streamreader sr6 = file.opentext(@"c:\temp\utf-8.txt");
初始化完成之後,你可以每次讀一行,也可以每次讀乙個字元 ,還可以每次讀幾個字元,甚至也可以一次將所有內容讀完。
// 讀一行
string nextline = sr.readline();
// 讀乙個字元
int nextchar = sr.read();
// 讀100個字元
int nchars = 100;
char chararray = new char[nchars];
int ncharsread = sr.read(chararray, 0, nchars);
// 全部讀完
string restofstream = sr.readtoend();
使用完streamreader之後,不要忘記關閉它: sr.closee();
假如我們需要一行一行的讀,將整個文字檔案讀完,下面看乙個完整的例子:
streamreader sr = file.opentext(@"c:\temp\ascii.txt");
string nextline;
while ((nextline = sr.readline()) != null)
sr.close();
(二) 寫入檔案
寫檔案和讀檔案一樣,如果你要寫入的內容不是很多,可以使用file.writealltext方法來一次將內容全部寫如檔案。如果你要將乙個字串的內容寫入檔案,可以用file.writealltext(filepath) 或指定編碼方式 file.writealltext(filepath, encoding)方法。
string str1 = "good morning!"; file.writealltext(@"c:\temp\test\ascii.txt", str1); // 也可以指定編碼方式 file.writealltext(@"c:\temp\test\ascii-2.txt", str1, encoding.ascii);
string strs = ; file.writealllines(@"c:\temp\ascii.txt", strs); file.writealllines(@"c:\temp\ascii-2.txt", strs, encoding.ascii);
使用file.writealltext或file.writealllines方法時,如果指定的檔案路徑不存在,會建立乙個新檔案;如果檔案已經存在,則會覆蓋原檔案。
當要寫入的內容比較多時,同樣也要使用流(stream)的方式寫入。.net封裝的類是streamwriter。初始化streamwriter類同樣有很多方式:
streamwriter sw2 = new streamwriter(@"c:\temp\utf-8.txt", true, encoding.utf8);
// filemode.createnew: 如果檔案不存在,建立檔案;如果檔案已經存在,丟擲異常
filestream fs = new filestream(@"c:\temp\utf-8.txt", filemode.createnew, fileaccess.write, fileshare.read);
// utf-8 為預設編碼
streamwriter sw3 = new streamwriter(fs);
streamwriter sw4 = new streamwriter(fs, encoding.utf8);
// 如果檔案不存在,建立檔案; 如果存在,覆蓋檔案
fileinfo myfile = new fileinfo(@"c:\temp\utf-8.txt");
streamwriter sw5 = myfile.createtext();
初始化完成後,可以用streamwriter物件一次寫入一行,乙個字元,乙個字元陣列,甚至乙個字元陣列的一部分。
// 寫乙個字元
sw.write('a');
// 寫乙個字元陣列
char chararray = new char[100];
// initialize these characters
sw.write(chararray);
// 寫乙個字元陣列的一部分
sw.write(chararray, 10, 15);
同樣,streamwriter物件使用完後,不要忘記關閉。sw.close(); 最後來看乙個完整的使用streamwriter一次寫入一行的例子:
fileinfo myfile = new fileinfo(@"c:\temp\utf-8.txt");
streamwriter sw = myfile.createtext();
string strs = ;
foreach (var s in strs)
sw.close();
C 對文字檔案的幾種讀寫方法總結
讀取文字 如果你要讀取的檔案內容不是很多,可以使用 file.readalltext filepath 或指定編碼方式 file.readalltext filepath,encoding 的方法。它們都一次將文字內容全部讀完,並返回乙個包含全部文字內容的字串 string str file.rea...
VBS對文字檔案的讀寫方法
讀例子 set fso createobject scripting.filesystemobject 繫結fso物件 if fso.fileexists s fileurl then 用.fileexists方法檢查檔案是否存在 set myfile fso.opentextfile s file...
C 文字檔案讀寫的方法
掌握文字檔案讀寫的方法 了解二進位制檔案的讀寫方法 c 檔案流 fstream 檔案流 ifstream 輸入檔案流 ofstream 輸出檔案流 建立乙個文字檔案並寫入資訊 同向螢幕上輸出資訊一樣將資訊輸出至檔案 1 include void main f.close 2 include incl...