2011-09-21 143 views
1

如何使用WriteFile Win32 API函數將CString實例的內容寫入由CreateFile打開的文件?使用WriteFile API將Unicode字符串CString寫入文件

請注意不使用MFC,和CString的是使用包括 「atlstr.h」

編輯:可以只是我做的

WriteFile(handle, cstr, cstr.GetLength(), &dwWritten, NULL); 

WriteFile(handle, cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL); 

+1

文本文件有一個規範。你需要哪種格式的結果文件?誰將使用該文件?您可能不應該將TCHAR寫入文件;你應該明確編碼(UTF-16,UTF-8,ANSI,...)。 – tenfour

+0

我會用記事本讀取文件。格式?只是一些接一個的路線。我希望能夠在記事本中打開文件,而不管項目的編碼如何。這是不可能的還是我可以嗎? –

+0

你想使用什麼編碼? UTF-16? UTF8? ANSI? –

回答

4

用ATL是這樣的:

CString sValue; 
CStringW sValueW(sValue); // NOTE: CT2CW() can be used instead 

CAtlFile File; 
ATLENSURE_SUCCEEDED(File.Create(sPath, GENERIC_WRITE, ...)); 
static const BYTE g_pnByteOrderMark[] = { 0xFF, 0xFE }; // UTF-16, Little Endian 
ATLENSURE_SUCCEEDED(File.Write(g_pnByteOrderMark, sizeof g_pnByteOrderMark)); 
ATLENSURE_SUCCEEDED(File.Write(sValueW, (DWORD) (sValueW.GetLength() * sizeof (WCHAR)))); 

它的字節順序標記(BOM),它可以讓記事本知道編碼是UTF-16。

1

我相信你需要額外的鑄造:

 
WriteFile(handle, (LPCVOID)(LPCTSTR)cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL); 
+0

1)如果你必須在回答中加上「我相信」,最好不要回答。 2)永遠不會失敗* – tenfour

+1

@tenfour:好的,我相信,不僅僅是相信。關於轉換爲void * - 這是WriteFile參數類型。我相信你的帖子不是建設性的... –

4

你需要選擇一個文本編碼,字符串轉換成編碼,並編寫相應的文本文件。最簡單的是ANSI,所以基本上你會使用T2CA宏將TCHAR字符串轉換爲ansi,然後將內容轉儲到文件中。喜歡的東西(未經測試/編譯):

// assumes handle is already opened in an empty new file 
void DumpToANSIFile(const CString& str, HANDLE hFile) 
{ 
    USES_CONVERSION; 
    PCSTR ansi = T2CA(str); 
    DWORD dwWritten; 
    WriteFile(hFile, ansi, strlen(ansi) * sizeof(ansi[0]), &dwWritten, NULL); 
}    

因爲這是ANSI編碼,雖然,它只會是你有相同的代碼頁設置的計算機上閱讀。對於更便攜的解決方案,請使用UTF-8或UTF-16。

2

轉換爲ANSI可能會導致代碼頁出現問題,因此在許多情況下不可接受。這裏是保存unicode字符串爲Unicode文本文件中的函數:

void WriteUnicodeStringToFile(const CString& str, LPCWSTR FileName) 
{ 
HANDLE f = CreateFileW(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
if (f == INVALID_HANDLE_VALUE) return; //failed 
DWORD wr; 
unsigned char Header[2]; //unicode text file header 
Header[0] = 0xFF; 
Header[1] = 0xFE; 
WriteFile(f, Header, 2, &wr, NULL); 
WriteFile(f, (LPCTSTR)str, str.GetLength() * 2, &wr, NULL); 
CloseHandle(f); 
} 

使用:

CString str = L"This is a sample unicode string"; 
WriteUnicodeStringToFile(str, L"c:\\Sample.txt"); 

記事本明白Unicode文本文件。

0

另外,請確保您在開始時編寫了適當的字節順序標記,以便記事本可以正確讀取它。