CStdioFile之ReadString()與WriteString()注意事項
阿新 • • 發佈:2019-01-05
簡介:
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); }
結果每個檔名結尾都有一個"\r",這顯示不是我期望的。為什麼會這樣呢?原因如下: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
因為WriteString()寫檔案的時候,會自動將"\n"擴充套件為"\r\n",這樣我們所加的"\r\n"就變成了"\r\r\n",</span></span
故在寫檔案時,字串結尾只需要加"\n"即可,這樣按行讀取的資料結尾才不會包含"\r"。