Winapi 使用WriteFile API将unicode字符串写入文件
如何使用WriteFile Win32 API函数将CString实例的内容写入CreateFile打开的文件 请注意,MFC未使用,CString通过包含“atlstr.h”来使用 编辑:我能做什么Winapi 使用WriteFile API将unicode字符串写入文件,winapi,atl,cstring,writefile,Winapi,Atl,Cstring,Writefile,如何使用WriteFile Win32 API函数将CString实例的内容写入CreateFile打开的文件 请注意,MFC未使用,CString通过包含“atlstr.h”来使用 编辑:我能做什么 WriteFile(handle, cstr, cstr.GetLength(), &dwWritten, NULL); 或 ?我认为您需要额外的铸造: WriteFile(handle, (LPCVOID)(LPCTSTR)cstr, cstr.GetLength() * sizeo
WriteFile(handle, cstr, cstr.GetLength(), &dwWritten, NULL);
或
?我认为您需要额外的铸造: WriteFile(handle, (LPCVOID)(LPCTSTR)cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL); WriteFile(handle,(LPCVOID)(LPCTSTR)cstr,cstr.GetLength()*sizeof(TCHAR),&dwwrited,NULL);
我相信你需要更多的演员: WriteFile(handle, (LPCVOID)(LPCTSTR)cstr, cstr.GetLength() * sizeof(TCHAR), &dwWritten, NULL); WriteFile(handle,(LPCVOID)(LPCTSTR)cstr,cstr.GetLength()*sizeof(TCHAR),&dwwrited,NULL);
您需要选择文本编码,将字符串转换为该编码,并相应地写入文本文件。最简单的是ANSI,因此基本上您可以使用
T2CA
宏将TCHAR
字符串转换为ANSI,然后将内容转储到文件中。类似(未经测试/编译):
因为它是ANSI编码,所以它只能在具有相同代码页设置的计算机上读取。对于更便携的解决方案,请使用UTF-8或UTF-16。您需要选择一种文本编码,将字符串转换为该编码,并相应地写入文本文件。最简单的是ANSI,因此基本上您可以使用
T2CA
宏将TCHAR
字符串转换为ANSI,然后将内容转储到文件中。类似(未经测试/编译):
因为它是ANSI编码,所以它只能在具有相同代码页设置的计算机上读取。对于更便携的解决方案,请使用UTF-8或UTF-16。转换为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文本文件。转换为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文本文件。对于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。对于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)如果你必须写“我相信”在你的回答中,最好不要回答。2) 永远不要向虚空施放*@tenfour:好吧,我肯定,不仅仅是beleive。关于强制转换为void*-这是WriteFile参数类型。我认为你的帖子没有建设性……1)如果你必须在答案中加上“我相信”,那么最好不要回答。2) 永远不要向虚空施放*@tenfour:好吧,我肯定,不仅仅是beleive。关于强制转换为void*-这是WriteFile参数类型。我相信你的文章没有建设性…文本文件有一个规范。您希望生成的文件采用哪种格式?谁将使用该文件?您可能不应该将TCHARs写入文件;您应该明确编码(UTF-16、UTF-8、ANSI等)。我将使用记事本读取文件。格式?只是一行接一行。我希望能够在记事本中打开文件,而不考虑项目的编码。这是不可能的还是我可以?你想用什么编码?UTF16?UTF8?ANSI?文本文件有一个规范。您希望生成的文件采用哪种格式?谁将使用该文件?您可能不应该将TCHARs写入文件;您应该明确编码(UTF-16、UTF-8、ANSI等)。我将使用记事本读取文件。格式?只是一行接一行。我希望能够在记事本中打开文件,而不考虑项目的编码。这是不可能的还是我可以?你想用什么编码?UTF16?UTF8?ANSI?