今天的任务是要保存一个文件。平常看别人怎么写,自己还只是看,没有动手去写过,对各个API相应的参数不是很了解。今天在运用的时候,还真是遇见了一些问题。 BOOL WriteFile( HANDLE hFile, // 文件句柄 LPCVOID lpBuffer, // 包含写向文件的数据 DWORD nNumberOfBytesToWrite, // 数据包含的字符串的个数 LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); 第一次我写的程序很简单 BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer, DWORD dwLen) { HANDLE hFile = CreateFile(pFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (INVALID_HANDLE_VALUE != hFile) { DWORD dwSize = 0; WriteFile(hFile, pBuffer, dwLen, &dwSize, NULL ); CloseHandle(hFile); return TRUE; } return FALSE; }
这样是完成了,但是写出来的文件是乱码。所以没有进行字符的转换,我们需要将pBuffer进行转换。这就要用到了WideCharToMultiByte.如何用呢? 首先我的方法比较笨,我是这么用的: char* pchBuffer = new char[dwLen+1]; WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen+1, NULL, FALSE ); WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL ); Delete[] pchBuffer;
此时注意,我在WriteFile中用了dwLen+1。结果就是在文件的末尾出现了乱码,正好多一个乱码出来。所以WriteFile中nNumberOfBytesToWrite是写的字符串的数目,是不包括’\
这个方法笨,是因为我们的函数可以缩减为两个参数。是因为如下这么写时,dwLen是所要转换的字符串的个数,此时转换的字符串是包括’\ DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );
所以我们再来看一下改写以后的代码 BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer) { HANDLE hFile = CreateFile(pFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (INVALID_HANDLE_VALUE != hFile) { DWORD dwSize = 0; DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE ); char* pchBuffer = new char[dwLen]; WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen, NULL, FALSE ); WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL ); delete[] pchBuffer; CloseHandle(hFile); return TRUE; } return FALSE; }
这样感觉代码好看多了。
对于第二个问题,文件打开的时候文件创建失败,还没有想好办法解决。我在想是不是我的某些认知存在问题,文件打开的时候,是否可以用CreateFile来打开呢? |
|
来自: BeautymengRoom > 《c 》