CAtlFileでUTF-8形式のテキストファイルを読み込む

test117.gif
ここではATLに備わるファイル操作用のクラス「CAtlFile」を利用してUTF-8形式のテキストファイルを読み込み、メッセージボックスに表示した。

UTF-8からユニコードへの変換にはMultiByteToWideCharを利用する。

依存環境:ATL
#include <atlfile.h>


//
//	UTF8文字列を普通のユニコード文字列に変換する
//
//CP_UTF8はWindows98では利用できない?
//
WCHAR*	ConvertUTF8ToUnicode(const char* pszUTF8)
{
	int		nLen;
	WCHAR*	pszWchar;

	//Unicodeに必要な文字数の取得
	nLen = ::MultiByteToWideChar(CP_UTF8,0,pszUTF8,-1,NULL,0);
	pszWchar = new WCHAR[nLen];
	if(pszWchar == NULL)
		return	NULL;

	//変換
	nLen = ::MultiByteToWideChar(CP_UTF8,0,pszUTF8,(int)::strlen(pszUTF8)+1,pszWchar,nLen);
	if(nLen)
		return	pszWchar;

	delete	pszWchar;

	return	NULL;
}







bool	Test()
{
	bool		ret;
	HRESULT		hr;
	ULONGLONG	nLen;
	CAtlFile	cFile;

	//ファイルを読み込みモードで開く
	hr = cFile.Create(_T("テスト.txt"),GENERIC_READ,FILE_SHARE_READ,OPEN_EXISTING);
	if(FAILED(hr))
		return	false;	//ファイルを開くのに失敗

	//ファイルサイズを取得
	hr = cFile.GetSize(nLen);

	ret = false;
	if(SUCCEEDED(hr))
	{
		char*	pszBuff;

		pszBuff = new char[(size_t)nLen + 1];
		if(pszBuff)
		{
			//ファイルにはNULL文字がないので付加しておく
			pszBuff[nLen] = NULL;

			//ファイルを読み込む
			hr = cFile.Read(pszBuff,(DWORD)nLen);

			//読み込んだ内容をメッセージボックスで表示
			if(SUCCEEDED(hr))
			{
				WCHAR*	pwszBuff;

				//UTF8をUnicodeに変換
				pwszBuff = ConvertUTF8ToUnicode(pszBuff);

				if(pwszBuff)
				{
					//このメッセージボックス関数は基本的にWindows 9xでは使えないので注意!
					::MessageBoxW(NULL,pwszBuff,L"",MB_OK);
					ret = true;

					delete	pwszBuff;
				}
			}

			delete	pszBuff;
		}
	}

	//ファイルを閉じる
	cFile.Close();

	return	ret;
}


プロジェクトファイルをダウンロード


カテゴリー「ファイル・フォルダ」 のエントリー