重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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;

A 回答 (3件)

質問の仕方について指摘だけします.



「文字化けする」と言われていますが, 「何がどう」文字化けするのですか? これは, あなたにはわかっているはずの情報です. それを, なぜ出そうとしないのですか?

完全なプログラムを提示しているならともかく, これはどう見ても「完全なプログラム」ではありませんから, 「どう文字化けするのか」がわかるのはあなただけですよ. そして, 「何がどう文字化けするのか」がわかればそこから判断できることも多いのです.
    • good
    • 0

そういうのは大体出力対象のロケールと、プログラム内で扱っている文字コードの兼ね合いです。


まぁ読み込んだテキストを変な加工してなかったりした場合の話ですけど。

ソースを見る限りワイド文字版プログラムではないようですが・・・
    • good
    • 0

>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;
の間違いじゃありませんか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!