TCHARで取得した文字列をchar型の配列に入れたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aim

TCHARで取得した文字列をchar型の配列に入れたい

#1

投稿記事 by aim » 14年前

列挙したファイル名をchar型の配列に格納するプログラムを作ろうとしています。
列挙時にTCHARでファイル名を獲得しているのですが、それをどうやったらchar型に変換するのかが分かりません。
どなたか解決方法をお分かりになる方は、よろしければご回答していただきたいと思います。
一部ソース(winproc)を載せておきます。

コード:

char jpeg[3][100] = { " ", " ", " "} ;//ファイル名格納用配列



LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
 
    HDC hdc;
    PAINTSTRUCT ps;
	  static HDC hDC, hCompatDC; 

	HANDLE hSearch, hFile;
	WIN32_FIND_DATA fd;
	TCHAR filename[MAX_PATH+10];
	DWORD writeSize;

    switch(uMsg){

		case WM_LBUTTONDOWN:	// マウスの左ボタンが押されたときに送られてくる
			ii++;
			if(ii==3){
				ii=0;
			}
			InvalidateRect( hWnd, NULL, TRUE );
			return 0;

		case WM_PAINT:

			hdc=GetDC(hWnd);
            hMain=CreateCompatibleDC(NULL);
            //GetHandle("test1.jpg",hWnd,hdc);
			GetHandle(jpeg[ii],hWnd,hdc);//画像の読み込み
            hdc=GetDC(hWnd);
            hdc=BeginPaint(hWnd,&ps);
            BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMain,0,0,SRCCOPY);
            EndPaint(hWnd,&ps);
            
            return 0;


///////////////////////////////////
        
		case WM_CREATE:   // ウィンドウが作成されたとき
		// ファイルを新規作成
		hFile = CreateFile(
			_T("filelist.txt"), GENERIC_WRITE, 0, NULL,
			CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
		);
		if( hFile == INVALID_HANDLE_VALUE )
		{
			return 0;
		}

				// 全てのファイルを列挙する
				//確認のためtextファイルに書き出し
		hSearch = FindFirstFile( _T("*.jpg"), &fd );
		if( hSearch == INVALID_HANDLE_VALUE )
		{
			return 0;
		}
		while( TRUE )
		{
			// 列挙されたファイル名を書き出す
			_tcscpy( filename, fd.cFileName ); // ファイル名をバッファにコピー
			_tcscat( filename, _T("\r\n") );   // 末尾に改行文字を加える
			WriteFile(
				hFile, filename, (DWORD)(_tcslen(filename)*sizeof(TCHAR)),
				&writeSize, NULL
			);


			jpeg[ii][100]=filename;
			ii++;
			
			if( !FindNextFile( hSearch, &fd ) )
			{
				if( GetLastError() == ERROR_NO_MORE_FILES )
				{
					MessageBox( hWnd, _T(filename), _T("終了"), MB_OK );
					break;
				}
				else
				{
					MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
					break;
				}
			}
		}

		FindClose( hSearch );
		CloseHandle( hFile );

		return 0;

		/////////////

		
		case WM_DESTROY:
            DeleteDC(hMain);
            DeleteObject(hBitmap);
            PostQuitMessage(0);
            return 0;
        
    }
    
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    
}

			jpeg[ii][100]=filename;
			ii++;
			
			if( !FindNextFile( hSearch, &fd ) )
			{
				if( GetLastError() == ERROR_NO_MORE_FILES )
				{
					MessageBox( hWnd, _T(filename), _T("終了"), MB_OK );
					break;
				}
				else
				{
					MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
					break;
				}
			}
		}

		FindClose( hSearch );
		CloseHandle( hFile );

		return 0;

		/////////////

		
		case WM_DESTROY:
            DeleteDC(hMain);
            DeleteObject(hBitmap);
            PostQuitMessage(0);
            return 0;
        
    }
    
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    
}
codeタグを追加しておきました。インデントをちゃんとされたほうが良いと思います。by softya(ソフト屋)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCHARで取得した文字列をchar型の配列に入れたい

#2

投稿記事 by softya(ソフト屋) » 14年前

コードタグを使ってくださいね。詳しくはフォーラムルールを。
http://dixq.net/board/board.html

WideCharToMultiByteで出来るはずです。
http://msdn.microsoft.com/ja-jp/library/cc448089.aspx
ただし、TCHARなので厳密にはWideCharToMultiByteで単純にやっちゃいけないんですけどね。
#ifdef UNICODE
#endif
時だけ変換が望ましいです。

使用例の参考
「MASATOの開発日記」
http://www.sutosoft.com/oldroom/devdiary/20020504.html
上記にサイトでは、UTF-8→UNICODE(UTF-16)→SJISということをやっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: TCHARで取得した文字列をchar型の配列に入れたい

#3

投稿記事 by ISLe » 14年前

FindFirstFileA,FindNextFileAを使って直接charで取得するという手もありますね。

あとCRT使って良ければ、VC++独自拡張で、fopenで入出力の文字コードを指定できますけど。

aim

Re: TCHARで取得した文字列をchar型の配列に入れたい

#4

投稿記事 by aim » 14年前

PCを修理に出していたため返信が遅れてしまいました。
申し訳ありません。
>>foftya(ソフト屋)さん
申し訳ありませんでした。次からはコードタグのことを気をつけます。

参考サイトを見させていただきましたが変換に関しては自分には難しいので無理そうでした。
なのでISLeさんのご提案のFindFirstFileA,FindNextFileAを使い直接CHAR型で受け取ろうと思います。
ですがFindFirstFile と FindFirstFileA の違いが調べても良く分かりません。
使い方が載っているサイトも見つかりませんでした。
よろしければFindFirstFileA,FindNextFileA の使い方を教えていただけたらと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCHARで取得した文字列をchar型の配列に入れたい

#5

投稿記事 by softya(ソフト屋) » 14年前

FindFirstFile はコンパイルオプション(UNICODEを使用/マルチバイト文字を使用)でFindFirstFileW(UNICODE)とFindFirstFileA(マルチバイト文字)が自動的に切り替わります。
FindFirstFileAは強制的にマルチバイト文字(SJIS)を選択したことになります。使い方はFindFirstFile と同様です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る