1. 程式人生 > >CStdioFile之ReadString()與WriteString()注意事項

CStdioFile之ReadString()與WriteString()注意事項

簡介:

CStdioFile


 └CFile
    └CStdioFile

文字方式提供對硬回車—換行符對的特殊處理

當你將一個換行符(0x0A)寫入一個文字方式的CStdioFile物件時,位元組對(0x0A,0x0D)被髮送給該檔案,即自動將"\n"擴充套件為了"\r\n",個人認為這可能是Windows做的一種相容,但有利卻也有弊;

當你讀一個檔案時,位元組對(0x0A,0x0D)被翻譯為一個位元組(0x0A)。


CStdioFile類成員

資料成員
包含了一個指向開啟檔案的指標

構造
從一個路徑或檔案指標構造一個CStdioFile物件

文字讀/寫

函式原型:

virtual LPTSTR ReadString( LPTSTR lpsz, UINT nMax );
BOOL ReadString

(CString& rString);

virtual void WriteString( LPCTSTR lpsz );

注意事項:

讀取寫檔案時,有時為了圖方便,喜歡使用 ReadString()和WriteString(),因為畢竟這個可以按行讀寫,不用我們關心行區分。

//開啟檔案
CStdioFile f;
CFileException e;
if (!f.Open("D:\\test.txt", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone, &e))“”
{
	return FALSE;
}

f.WriteString("E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\Fiddler.exe\r\n");
f.WriteString("E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\ExecAction.exe\r\n");
f.WriteString("E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\fiddler.exe.config\r\n");
f.WriteString("E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\FiddlerHook\chrome.manifest\r\n");
f.WriteString("E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\FiddlerHook\Content\about.xul\r\n");
f.Close();

//讀檔案
f.Open(m_sUpgradeFile, CFile::modeRead);
CString sFile = "";
vector<CString> vecFile;
while (m_hUpgradeFile.ReadString(sFile))
{
	vecFile.push_back(sFile);
}
 
結果如下:
E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\Fiddler.exe\r
E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\ExecAction.exe\r
E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\fiddler.exe.config\r
E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\FiddlerHook\chrome.manifest\r
E:\jiangqin\GameLinker\GameLinker\版本回退\Fiddler\FiddlerHook\Content\about.xul\r
結果每個檔名結尾都有一個"\r",這顯示不是我期望的。為什麼會這樣呢?原因如下:

因為WriteString()寫檔案的時候,會自動將"\n"擴充套件為"\r\n",這樣我們所加的"\r\n"就變成了"\r\r\n",</span></span

故在寫檔案時,字串結尾只需要加"\n"即可,這樣按行讀取的資料結尾才不會包含"\r"。