1

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

请注意不使用 MFC,通过包含“atlstr.h”使用 CString

编辑:我可以吗

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

或者

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

?

4

5 回答 5

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。

于 2011-09-21T13:02:36.160 回答
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。

于 2011-09-21T10:28:53.783 回答
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 文本文件。

于 2011-09-21T12:07:56.710 回答
1

我相信你需要额外的铸造:

WriteFile(handle, (LPCVOID)(LPCTSTR)cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL);
于 2011-09-21T10:09:46.793 回答
0

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

于 2011-09-21T13:03:52.990 回答