如何使用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);
答案 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)
还要确保在开头写入正确的字节顺序标记,以便记事本可以正确读取它。