
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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
質問の仕方について指摘だけします.
「文字化けする」と言われていますが, 「何がどう」文字化けするのですか? これは, あなたにはわかっているはずの情報です. それを, なぜ出そうとしないのですか?
完全なプログラムを提示しているならともかく, これはどう見ても「完全なプログラム」ではありませんから, 「どう文字化けするのか」がわかるのはあなただけですよ. そして, 「何がどう文字化けするのか」がわかればそこから判断できることも多いのです.
No.2
- 回答日時:
そういうのは大体出力対象のロケールと、プログラム内で扱っている文字コードの兼ね合いです。
まぁ読み込んだテキストを変な加工してなかったりした場合の話ですけど。
ソースを見る限りワイド文字版プログラムではないようですが・・・
No.1
- 回答日時:
>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;
の間違いじゃありませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での採番について
-
ファイル内のデータを1行削除...
-
C言語 バイナリファイルの読み...
-
書き込んだファイルに改行が入...
-
C言語初心者の質問失礼します。
-
バイナリ形式のXMLファイルを読...
-
C言語でBMPファイルの内容を表...
-
vba ActiveSheet.pasteを使った...
-
OpenDialog1->FileNameについて
-
FTPでputすると空ファイルが出...
-
どんなプログラムを書いても指...
-
「UNCパスはサポートされません...
-
フルパスから最後のディレクト...
-
LSI C-86 v3.30c 試食版について
-
SWTとSwingの違い
-
ファイル形式またはファイル拡...
-
dataファイルをxtxファイルにす...
-
VB.NETで他のプロジェクトで作...
-
バッファとは何ですか
-
VB6.0で作ったプロジェクトが起...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルの行数を取得...
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
ファイルサイズ指定し、ファイ...
-
c言語 2つのファイルを行ご...
-
0x00をファイル出力
-
C言語での採番について
-
VBSで指定行に挿入
-
テキストファイルの先頭への文...
-
fopen(ファイルパス)
-
C言語での改行コードの扱いにつ...
-
fopenで開いたファイルのサイズ...
-
winsock recvでの文字化け
-
EOF判定されない
-
fscanf関数のscanf集合を使う時...
-
巨大なテキストファイル(可変...
-
VS2010 MFC CStdioFileについて
-
(UWSC)このような場合、解決策...
-
改行までの一文字ずつのファイ...
おすすめ情報