昨天又用Win32来读取文件的时候,又出现了字符编码的问题。
用TCHAR字符来写文件呢,用系统的记事本打开是乱码。
用CHAR字字符来写呢,在读取汉字的时候后面有一串乱码,
用CHAR[]数组读取就没有后面多出来的空格或是乱码的情况,
用New CHAR[]就不行,我用memset()清零也没解决问题
图中后面是没有乱码了,但是后面多了好几个空格。有时后面是乱码。
真心的晕呀。
唉,闹心呀,
**********************************
今天又来研究的时候,突然想起读取数据完了要在后面加上个/0,试了下,居然没有问题了,真是醉了,
现记录下,以免以后又忘记了。
写入文件
void WriteFile(void) { HANDLE hFile = ::CreateFile(L"CreateFileDemo.txt", //创建文件的名称 GENERIC_WRITE | GENERIC_READ, //读写模式 0, //不共享读写 NULL, //缺省安全属性 CREATE_ALWAYS, //如果文件存在也创建 FILE_ATTRIBUTE_NORMAL, //一般的文件 NULL); //没有模板 if (hFile == INVALID_HANDLE_VALUE) { OutputDebugString(L"创建文件出错!"); } //往文件中写入数据 char chBuffer[] = "你是我的小苹果!abc"; DWORD dwWritenSize = 0; BOOL bRet = ::WriteFile(hFile, chBuffer, strlen(chBuffer), &dwWritenSize, NULL); if (bRet) { OutputDebugString(L"WriteFile 写入文件成功.\r\n"); } CloseHandle(hFile); }
//读取文件
void ReadFileRead(void) { HANDLE hFile = ::CreateFile(L"CreateFileDemo.txt", //创建文件的名称 GENERIC_WRITE | GENERIC_READ, //读写模式 0, //不共享读写 NULL, //缺省安全属性 OPEN_EXISTING, //打开一个存在的文件,不存在函数调用失败 FILE_ATTRIBUTE_NORMAL, //一般的文件 NULL); //没有模板 if (hFile == INVALID_HANDLE_VALUE) { OutputDebugString(L"创建文件出错!"); } int nFileLong =GetFileSize(hFile, NULL);//获得文件长度 DWORD drReadSize = 0; char *pChar=new char[nFileLong+1];//要多加一个,后面删除指针才不会报异常
memset(pChar,0,nFileLong);
BOOL bRet = ::ReadFile(hFile, pChar, nFileLong, &drReadSize, NULL);
//注意读取文件完了要在字符数组后面加上个0,昨天就是忘记这个了,弄了一晚上都没弄好。
pChar[drReadSize]=0;
if (bRet) { OutputDebugString(L"ReadFile 读取文件成功\r\n"); SetDlgItem(hWnd,IDC_EDIT1,pChar); } else { //获取出错码 DWORD dwError = GetLastError(); //处理出错. TCHAR chErrorBuf[1024]; wsprintf(chErrorBuf, L"GetLastError()=%d\r\n", dwError); OutputDebugString(chErrorBuf); }
Delete pChar; CloseHandle(hFile); }
效果图:
这下后面就没有空格和乱码的现象了。
唉,基础知识不牢的表现。