• 締切済み

文字化けを直したい

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;

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

質問の仕方について指摘だけします. 「文字化けする」と言われていますが, 「何がどう」文字化けするのですか? これは, あなたにはわかっているはずの情報です. それを, なぜ出そうとしないのですか? 完全なプログラムを提示しているならともかく, これはどう見ても「完全なプログラム」ではありませんから, 「どう文字化けするのか」がわかるのはあなただけですよ. そして, 「何がどう文字化けするのか」がわかればそこから判断できることも多いのです.

回答No.2

そういうのは大体出力対象のロケールと、プログラム内で扱っている文字コードの兼ね合いです。 まぁ読み込んだテキストを変な加工してなかったりした場合の話ですけど。 ソースを見る限りワイド文字版プログラムではないようですが・・・

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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

  • midiの再生が思うようにできません

    ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。 環境:WindowsXP, Visual C++ 2008 Express Edition 以下がプログラムのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { FILE *fp; errno_t err; TCHAR buf[30]; TCHAR *temp; int m=0, n=0; switch(msg) { case WM_CREATE: CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL); break; case WM_COMMAND: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } for(int i=0; i<2; i++){ _fgetts(buf, 10, fp); _tcstok(buf, TEXT("\n")); } while(_fgetts(buf, 30, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ if((m>=0 && m<110)&&(n>=0 && n<200)){ if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=0 && n<200)){ if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=220 && m<330)&&(n>=0 && n<200)){ if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=330 && m<440)&&(n>=0 && n<200)){ if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=440 && m<550)&&(n>=0 && n<200)){ if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=550 && m<660)&&(n>=0 && n<200)){ if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=660 && m<770)&&(n>=0 && n<200)){ if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=200 && n<400)){ if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; 以下省略 . . . }else{ break; } } } free(temp); fclose(fp); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

  • WINAPI editbox内の文字が文字化けする

    プログラムは、ウィンドウ内にエディットボックスを表示するだけのものです。 下のプログラムを実行すると、エディットボックス内に ”繧ィ” と表示されます。また、“エディタ“ と入力すると ”ィ」ソ” と表示されます。 GetWindowTextでテキストを取得すると、MessageBoxには何も表示 されませんでした。 使用しているパソコンはwindows10です。 どうすれば文字化けが解消されるのでしょうか。 #include <stdio.h> #include <windows.h> HINSTANCE hinstance; TCHAR tch[128]; LRESULT CALLBACK winpr(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow) { TCHAR szwinClass[]=TEXT("samp1"); TCHAR sztitle[]=TEXT("サンプル"); int width=720; int height=720; WNDCLASSEX wcx; HWND hwnd; MSG msg; hinstance=hinst; wcx.cbSize=sizeof(WNDCLASSEX); wcx.style=CS_HREDRAW | CS_VREDRAW; wcx.hbrBackground=(HBRUSH)(COLOR_WINDOWTEXT+1); wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hIcon=NULL; wcx.hIconSm=NULL; wcx.hCursor=LoadCursor(NULL,IDC_ARROW); wcx.hInstance=hinstance; wcx.lpfnWndProc=winpr; wcx.lpszClassName=szwinClass; wcx.lpszMenuName=sztitle; if(!RegisterClassEx(&wcx)){ MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OK); return 1; } hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,szwinClass,sztitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, width,height, NULL,NULL,hinstance,NULL); if (!hwnd) { MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OKCANCEL); int err=GetLastError(); return 1; } ShowWindow(hwnd,ncmdshow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)>0){ TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK winpr(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam){  HDC hdc; HWND hwndedit; int id; switch(message){ case(WM_CREATE): hwndedit= CreateWindow( TEXT("edit"), TEXT("エディタ"), WS_CHILD | WS_VISIBLE , 10, 10, 200, 30, hwnd, (HMENU)1,hinstance, NULL); return 0; case(WM_CLOSE): GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); MessageBox(hwnd,tch,TEXT("文字化け"),MB_OK); id=    MessageBox(hwnd,TEXT("閉じる"),TEXT("閉じる"),          MB_OKCANCEL); if (id==IDOK){ DestroyWindow(hwnd); } return 0; case(WM_DESTROY): PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } }

  • 自作関数で元の値を変更したい

    ポインタとかが分からないので教えてください。 元のプロセスで  case WM_KEYDOWN:   MyFunc(hWnd);   if(!hWnd)MessageBox(NULL, "成功", "", MB_OK);   else MessageBox(NULL, "エラー", "", MB_OK);  break; 元のプロセスの自作関数で void MyFunc(HWND wnd){  SetWindowText(wnd, "てすと");//これはちゃんとできた。  wnd = NULL;//ここが失敗で、この関数を抜けるまでしか効果がない。 } これで MessageBox(NULL, "エラー", "", MB_OK); が実行されてしまいました。

  • win32apiでbmpを表示する関数についてです

    bmpを表示する関数と処理する関数を別々のファイルにしたいのですが、表示されません・・・。エラー、警告はありませんでした。VC++2008を使用しています。ソースは以下のようになっています。よろしくお願い致します。 ~ 処理部分 load_bmp.cpp ~ #include <windows.h> #include <stdio.h> #include <tchar.h> extern HINSTANCE hinst; extern HWND hwnd; int Load_Bmp( HDC hdc, char *f_name_of_BMP) { HBITMAP hbmp; HDC work_DC; hbmp=(HBITMAP)LoadImage(hinst,_T ("f_name_of_BMP"),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE); if( hbmp == NULL ){ MessageBox(hwnd, _T("ビットマップを表示できません"), _T("エラー"),MB_OK | MB_ICONWARNING); return 0; } work_DC = CreateCompatibleDC( hdc ); SelectObject( work_DC, hbmp ); BitBlt(hdc,0,0,640,480,work_DC,0,0,SRCCOPY); ReleaseDC( hwnd,work_DC ); DeleteObject( hbmp ); return 0; } ~ヘッダファイル load_bmp.h ~ int Load_Bmp( HDC hdc,char *f_name_of_BMP); ~処理部分 main.cpp ~ #include <windows.h> #include <tchar.h> #include "load_bmp.h" HWND hwnd; HDC win_hdc; HINSTANCE hinst; void init_game() { Load_Bmp( win_hdc,"test.bmp"); } LRESULT WndProc(HWND hwnd,UINT msg,WPARAM wprm,LPARAM lprm) { switch(msg){ case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wprm,lprm); } return 0; } int APIENTRY WinMain(HINSTANCE hIns,HINSTANCE hPI,LPSTR lpArg,int nCmdShow) { MSG msg; WNDCLASS wc; hinst=hIns; wc.hInstance=hIns; wc.lpszClassName=_T("test"); wc.lpfnWndProc=(WNDPROC)WndProc; wc.style=0; wc.hIcon=LoadIcon((HINSTANCE)NULL,IDI_APPLICATION); wc.hCursor=LoadCursor((HINSTANCE)NULL,IDC_ARROW); wc.lpszMenuName=0; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); if(RegisterClass(&wc)==0)return 0; hwnd=CreateWindowEx( 0, wc.lpszClassName, _T("test"), WS_OVERLAPPEDWINDOW, 20,20,640,480, NULL, NULL, hIns, NULL     ); if(!hwnd) return 0; ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); win_hdc=GetDC(hwnd); init_game(); while(1){  if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ (!GetMessage(&msg,(HWND)NULL,0,0));break; TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

  • ドロップで起動するけどパスは?

    ファイルをEXEにドロップして起動させます。 ドロップしたファイルのパスを GetCommandLine( ) から 取り出すために、" の位置を調べます。 "EXEのパス" ドロップファイルのパス となっているから、2番目の " の位置を調べました。 でも、for でのループが1回で終わってしまいます。 おかしいところを教えてください。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {  char *p = GetCommandLine();  char str[200];  switch(msg){  case WM_CREATE:   int i;   for(i = 1; p[i] == '"'; i++);{    wsprintf(str, "%d", p[i]);    MessageBox(hWnd, chStr, "", MB_OK);   }   wsprintf(chStr, "%d", i);   MessageBox(hWnd, str, "", MB_OK); //結果は1   wsprintf(chStr, "%#x", p[0]);   MessageBox(hWnd, str, "1文字目", MB_OK); //結果は34   wsprintf(chStr, "%#x", p[1]);   MessageBox(hWnd, str, "2文字目", MB_OK); //結果は67   wsprintf(chStr, "%#x", p[2]);   MessageBox(hWnd, str, "3文字目", MB_OK); //結果は58

  • C言語・Windows 文字の出力ができない

    C言語でWindowsプログラミングをしているのですが、文字がうまく扱えなくて困っています。 txtファイルから読み込んだ文字を"@@"のところで区切って、ウィンドウに描画するだけなのですが、うまくできません。 例) contents.txtファイル(以下中身です。) データ整理@@ファイル、フォルダをインポート@@アドレスからインポート@@txtとpdf(html,jpg,bmp)を等価に扱う@@検索@@タグ これをウィンドウに  データ整理  ファイル、フォルダをインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に扱う  検索  タグ というように表示したいのですが、なぜか  データ整理  ファイル、フォルダをインポートアドレスからインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に検索  検索  タグ のように表示されてしまいます。 (二段目と四段目がおかしくなっています、書き間違えではないです、念のため) 初心者なので、勉強不足による些細な間違いかもしれませんが、なにとぞ知恵をお貸しくださいm(_ _)m 以下、ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型は問題ないと判断しました。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int i = 0, j = 0, k = 0; int fp; HDC hdc; PAINTSTRUCT ps; char script[1000]; static char title[100][30]; switch (msg){ //ウィンドウ生成時 case WM_CREATE: fp = Reading("./contents.txt", script); if(fp == -1){ MessageBox(hWnd, (LPCSTR)"contents.txtが存在しない", (LPCSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION); }else{ for(;;){ if(script[i] == '\0'){ title[j][k] = '\0'; break; }else if(script[i] == '@' && script[i+1] == '@'){ title[j][k] = '\0'; i += 2; j++; k = 0; }else{ title[j][k] = script[i]; i++; k++; } } for(i = 0; i <= j; i++){ } } break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SetBkMode(hdc, TRANSPARENT); for(i = 0; i <= j; i++){ TextOut(hdc, 0, MOJI_SIZE * i, (LPSTR)title[i], strlen(title[i])); } EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //読み込み int Reading(const char* filename, char* script) { int pos = 0; char c; //スクリプトファイル FILE* fp; //スクリプトファイルを開く fp = fopen(filename, "r"); if( fp == NULL ) { //ファイル読み込みに失敗 return -1; } for( ;; ) { //一文字読み込み c = fgetc( fp ); //ファイルの終わりかどうか if( feof( fp ) ) { script[pos] = '\0'; break; } //改行文字が出てきた場合,無視 if( c != '\n' && c != '\t' ) { //書き込み script[pos] = c; //文字書き込み位置をずらす pos++; } } fclose(fp); return 0; }

  • リサイズで文字が消えちゃう

    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {  HDC hdc;  char *str;  switch (msg) {   case WM_KEYDOWN:   hdc = GetDC(hWnd);   str = "キーダウンした";   TextOut(hdc,1,1,str,strlen(str));   ReleaseDC(hWnd,hdc);   break; キーを押すと、LRESULT CALLBACK でウインドウに文字が 表示されるようにしました。 でも、この文字は別のウインドウに隠れて、再びウインドウが 表示された場合とかには消えています。 消えないようにするためにはどうしたらいいですか? void Swit(HWND hWnd) {  HDC hdc;  char *str;  if (キーダウンのフラグがあったとして、それが true なら) {   hdc = GetDC(hWnd);   str = "キーダウンした";   TextOut(hdc,1,1,str,strlen(str));   ReleaseDC(hWnd,hdc);  } return; } if ( ウインドウ再描画 == true ){ Swit() } というのを考えました。 LRESULT CALLBACK で、キーが押された場合にフラグを true にして ウインドウが再描画された場合にフラグをチェックして文字を 表示する という方法を考えたんだけど、これを BCC32 でコンパイル するためにはどういうソースを書いたらいいか分からないし、 もっといい方法があれば教えてください。

  • fwprintf()について

    テキストファイルに全角文字を出力したのですがなぜか出力するとテキストファイルには???と出力されてしまいます。 どうしたらちゃんと出力されるでしょうか? #include<windows.h> #include<TCHAR.h> int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hprevInst,LPTSTR nCmdLine,int nCmdShow) { FILE* fp; fp=_wfopen(_T("takoyaki.txt"),_T("w")); if(fp==NULL) { MessageBox(NULL,_T("ファイルが開きません"),_T("エラー"),MB_OK); } fwprintf(fp,_T("%s"),_T("おはよう。")); return 0; } 環境はWinXP pro、 開発環境はVC++2005です。 よろしくお願いします。

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • 単語数をカウントするアプリケーションを作りたい

    お世話になっております(初心者です)。 現在指定した文字の文字数をカウントするアプリケーションを自作しているのですが、行き詰ってしまったのでご教授を頂けないでしょうか。 使用言語はC/C++で、コンパイラはgccです。 ----------以下ソース int data_read( HWND hwnd,char *f_name ) { int i; FILE *fpr; fpr=fopen(f_name,"r"); if( fpr == NULL ){ MessageBox(hwnd,"データ読み込みエラーです","データ読み込みエラー",MB_OKCANCEL); return(-1); } i=0; while( fgets(g_str02[i],W_MAX,fpr) != NULL){ i++; } fclose(fpr); return(i); } int cou_e(HWND hwnd){ int i; int j,k; int l; l = data_read( hwnd,"c:\\result.txt" ); for(j=0;j<=l;j++){ for(k=0;g_str02[j][k] = '\n';k++){ if( g_str02[j][k] == 'e' ){ i++; } } } g_cou_e = i; return(0); } ----------ソースここまで ※必要なヘッダファイルはインクルード済 ※g_str02[j][k]はグローバルで宣言した関数(char型)。 ※g_cou_eはグローバルで宣言した関数で、指定したテキストファイルの'e'の数が格納される関数(int型)。 ※c:\result.txtは文字数をカウントしたいテキストファイル。 このg_cou_eを他の関数で呼び出して使用したいのですが、今のところ実際にはテキストファイルに'e'は数個しか存在していないのにも関わらず、膨大な数値が表示されてしまったりしています。 ちなみに、コンパイラ自体は成功します。 どうぞ忌憚の無い意見をよろしくお願い致します。

専門家に質問してみよう