Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 使用WriteFile API将unicode字符串写入文件_Winapi_Atl_Cstring_Writefile - Fatal编程技术网

Winapi 使用WriteFile API将unicode字符串写入文件

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 Win32 API函数将CString实例的内容写入CreateFile打开的文件

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

编辑:我能做什么

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?