使用WriteFile API将unicode CString写入文件

时间:2011-09-21 10:01:31

标签: winapi atl cstring writefile

如何使用WriteFile Win32 API函数将CString实例的内容写入CreateFile打开的文件中?

请注意不使用MFC,并且包含“atlstr.h”

使用CString

编辑:我可以吗

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

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

5 个答案:

答案 0 :(得分:5)

使用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 :(得分: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 :(得分: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文本文件。

答案 3 :(得分:1)

我相信你需要额外的演员:

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

答案 4 :(得分:0)

还要确保在开头写入正确的字节顺序标记,以便记事本可以正确读取它。