ページ 11

ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 03:29
by とく
あるファイルのパスをファイルに書き込み保存して、あるタイミングで読み出したいのですが、「蓮」という字をReadFile関数を使用して読み出すときに文字化けしてしまいます。なぜかファイルに書き込むのはうまくいっています。対策はありますか?よろしくお願いします。

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 14:57
by softya(ソフト屋)
できるだけシンプルにした問題が再現するソースコードを見せて頂けますか?

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 16:57
by とく
こちらがRead

コード:

	TCHAR TempPath[MAX_PATH]={0};
	DWORD FileSize,temp,PathSize;
	hFile = CreateFile(DirPath, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
	if(hFile == INVALID_HANDLE_VALUE){
		MessageBox::Show( "ファイルを開くことが出来ません。","ファイルオープンエラー");
		Close();
	}
	FileSize = GetFileSize(hFile,NULL)+1;
	TCHAR *heap = (TCHAR *)malloc(sizeof(TCHAR)*FileSize);
	TCHAR *p_heap=heap;
	ZeroMemory(heap,FileSize);
	ReadFile(hFile,heap,FileSize,&temp,NULL);
CloseHandle(hFile);

こちらがWrite DirPathにファイルの場所の文字列が入っています。

コード:

	TCHAR WritePath[sizeof(ExePath)+100];
	HANDLE hFile2;
	DWORD SizeData;
	int flag;
			
	wsprintf(WritePath,"%s@%s",ExePath[0],ExePath[1]);
	hFile2 = CreateFile(DirPath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
	if(hFile2 == INVALID_HANDLE_VALUE){
		MessageBox::Show( "ファイルを開くことが出来ません。","ファイルオープンエラー");
		Close();
		return;
	}
	flag=WriteFile(hFile2,WritePath,lstrlen(WritePath),&SizeData,NULL);
	if(flag==NULL){
		MessageBox::Show( "ファイルの書き込みに失敗しました。","ファイル書き込みエラー");
	}
	CloseHandle(hFile2);

こんな感じでよろしいでしょうか?

GetOpenFileName関数をつかって、その後テキストボックスに文字列を入れるときは「蓮」の字が入るのですが
その後に上の手順で保存し、プログラムを終了→プログラム開始→ファイルを読み込む→テキストボックスに文字列を入れる
とやると「蓮」の文字が文字化けしてしまします。

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 17:33
by h2so5
あまり詳しくは知りませんが、「蓮」の字の2バイト目には @ が含まれているため、
wsprintfのフォーマット"%s@%s"に引っかかっている可能性があります。

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 17:42
by softya(ソフト屋)
プロジェクトの構成のプロパティで文字セットはマルチバイト文字 or UNICODE文字のいずれでしょうか?
こちらで再現しないと的確なアドバイスが難しいので、出来ればそのまま動く形に整形したソースコードをお願いします。

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 19:12
by とく
@が引っかかっているかもしれないということで別の文字を試してみたところ!でうまくいきましたがなぜでしょうかね?
文字セットはマルチバイト文字です。
ソースコードは結構な量があるため難しいです。すいません。

Re: ファイルの読み出しが文字化け

Posted: 2011年4月01日(金) 22:49
by ISLe
wsprintf(WritePath,"%s@%s",ExePath[0],ExePath[1]);

wsprintf(WritePath,TEXT("%s@%s"),ExePath[0],ExePath[1]);
でないといけないのでは?