- 締切済み
文字化けを直したい
visual stadio C++ で、テキストファイルを読み込み、それをウインドウに表示するというプログラムを作っているのですが、表示すると文字化けしてしまいます。 原因がわかりません。 教えてください。 VC++ 2010です。 サイトを見て設定でマルチバイトに変えてあります case IDB_SELECT:{ HDC hDC; errno_t error; static LPCTSTR TEST_STR ;//= _T("左ボタンが押されました"); // ファイルを開くコモンダイアログを作成 if( !GetOpenFileName( &ofn ) ){ MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); return 0; } // 選択されたファイル名を表示 MessageBox( hWnd, filename_full, _T("OK"), MB_OK ); int k=0; fp = fopen( "test.txt", "r" ); if( fp == NULL ) /* 関数が失敗していないか */ { MessageBox( hWnd,"読み込み失敗", _T("bad"), MB_OK ); return 1; /* 異常終了は0以外を返す */ } MessageBox( hWnd,"読み込み成功", _T("good"), MB_OK ); hDC = GetDC( hWnd ); while (fgets(file, 80, fp) != NULL){ TEST_STR = &file[k]; TextOut( hDC, 50, k*15+50, TEST_STR, (int)_tcslen(TEST_STR) ); k++; } fclose(fp); } return 0L; } InvalidateRect(hWnd, NULL, TRUE); // 再描画命令発 return 0L;
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
質問の仕方について指摘だけします. 「文字化けする」と言われていますが, 「何がどう」文字化けするのですか? これは, あなたにはわかっているはずの情報です. それを, なぜ出そうとしないのですか? 完全なプログラムを提示しているならともかく, これはどう見ても「完全なプログラム」ではありませんから, 「どう文字化けするのか」がわかるのはあなただけですよ. そして, 「何がどう文字化けするのか」がわかればそこから判断できることも多いのです.
- okdummy001
- ベストアンサー率41% (5/12)
そういうのは大体出力対象のロケールと、プログラム内で扱っている文字コードの兼ね合いです。 まぁ読み込んだテキストを変な加工してなかったりした場合の話ですけど。 ソースを見る限りワイド文字版プログラムではないようですが・・・
- Wr5
- ベストアンサー率53% (2173/4061)
>while (fgets(file, 80, fp) != NULL){ >TEST_STR = &file[k]; >TextOut( hDC, 50, k*15+50, TEST_STR, (int)_tcslen(TEST_STR) ); >k++; >} まず、fileはナニモノですか? # たぶん char file[80]; でしょうか… test.txtが下記の内容(3行)だったとして、ループ中にどういう動作をするのか追ってみましょうか… ------------------------------------------------ visual stadio C++ で、テキストファイルを読み込み、 それをウインドウに表示するというプログラムを 作っているのですが表示すると文字化けしてしまいます。 ------------------------------------------------ ループ1回目でfile[]に "visual stadio C++ で、テキストファイルを読み込み、\n" が読み込まれます。 TEST_STR = &file[k]; で最初の'v'が入っているアドレスが設定され、文字列長も正しく取得されて TextOut()で描画されます。(改行文字がヘンに描画されるかも知れませんが。) ループ2回目でfile[]に "それをウインドウに表示するというプログラムを\n" が読み込まれます。 TEST_STR = &file[k]; で、'そ'(0x82BB)の2バイト目のアドレスを設定します。 ここで1文字目の'そ'が0xBB(半角カタカナのサ)に変身を遂げて描画されます。 # 変身ではなく以降のShift-JISの認識を壊すかも知れません…。 ループ3回目でfile[]に "作っているのですが表示すると文字化けしてしまいます。\n" が読み込まれます。 TEST_STR = &file[k]; で、最初の1文字分を飛ばした'っ'のアドレスを設定します。 文字列長も正しく認識されて、"作"を取り除いた内容が描画されます。(改行文字がおかしくなる可能性は前述の通り) って動作になってますが、期待している動作ですか? 1行読み込むたびに行番号に応じて先頭から無視して行く文字数が増えていきます。 80行を越えるとおそらくふっとぶコードでもあります。 &file[k]が領域外アクセスになるでしょう。 TEST_STR = &file[k]; は TEST_STR = file; の間違いじゃありませんか?