下面是一个读取Unicode文件的程序:
TCHAR* pContent = NULL;//保存从文件中读取的内容
HANDLE fileReadHandle = NULL;
TCHAR szFilePath[MAX_PATH];
wcsncpy(szFilePath, _T("//Program Files//test.txt"), MAX_PATH);
fileReadHandle = CreateFile(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE != fileReadHandle)
{
DWORD dwSize;
DWORD dwFileSize = GetFileSize(fileReadHandle, NULL); ------------------(1)
int len = dwFileSize/2+1;
pContent = new TCHAR[len];
memset(pContent, 0, sizeof(TCHAR)*(len)); ------------------(2)
SetFilePointer(fileReadHandle, 0, NULL, FILE_BEGIN);
WORD wdHead;
ReadFile(fileReadHandle, &wdHead, 2, &dwSize, NULL); ------------------(3)
if(wdHead != 0xfeff)
{
SetFilePointer(fileReadHandle, 0, NULL, FILE_BEGIN);
}
ReadFile(fileReadHandle, pContent , dwFileSize, &dwSize, NULL);
CloseHandle(fileReadHandle);
}
:: MessageBox(NULL, pContent , _T("test"), MB_OK));
前提是:test.txt中确实存在!并且是unicode文件!记得放在指定路径下哦:)
程序中需要注意的有3个问题,我已经用红线标出:
(1)GetFileSize得到的是文件的字节数!因此,如果在申请pContent的空间时,需要dwFileSize/2 +1;
(2)由于ReadFile读出来内容时是不会默认向pContent末尾添加结束符/0的,所以,在pContent申请空间完毕时,应通过memset把所有空间置0;
(3)如果test.txt是用户手动创建并以Unicode形式保存的,文件开头会默认加上一个0xfeff!因此,如果我们直接ReadFile读出所有内容,会发现显示出来的字符串前面始终有一个乱码!于是我们先读前2个WORD,如果发现是0xfeff,那么取其后面的内容。如果不是0xfeff(说明是从程序写入的),那么直接读取内容。
好,要说的就那么些,虽然是一个简单的读Unicode文件操作,却也引发不少的问题哈,要细心:)