• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C/C++で漢字の読みを取得したいです。)

C/C++で漢字の読みを取得する方法

このQ&Aのポイント
  • C/C++で漢字の読みを取得する方法について説明します。kakasiというライブラリを使用して漢字の読みを取得することができます。
  • エラーや警告が出る場合は、ファイルの設定やライブラリの読み込み方法を確認してください。
  • 詳しいエラーの内容や問題点がわからない場合は、質問サイトなどで質問してみると解決策が得られるかもしれません。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); が問題ですね kakasi-2.3.4.zipをダウンロード、展開してreadme-ja.win32を見ましたが 以下引用---------------------------------- <<< ライブラリについて >>> このアーカイブには Win32 向けの dynamic link library と static link libraryを同梱してあります。 VC++6.0 で compile した dynamic link library は lib\kakasi.dll と lib\kakasi.lib です。 VC++6.0 で compile した static link library は lib\libkakasi.lib です。 mingw32 の gcc-2.95 で compile した static link library は lib\libkakasi.a と lib\libkakasi.la です。 include file は共通で include\libkakasi.h です。 -----------------------引用終わり とあります dllを使いたいなら lib\kakasi.dll を指定しましょう ビルドメッセージからVisualC++と思われますがLoadLibraryで読み込まないでプロジェクトのプロパティで指定するとか #pragma comment(lib, "C:\\kakasi\\lib\\kakasi.lib") でもできますよ

hatokamome
質問者

お礼

ご回答ありがとうございます。 おかげさまで解決しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

http://kakasi.namazu.org/index.html.ja の「Win32用 バイナリパッケージ」のリンク先からDLですか? kakasi-2.3.4.zipを展開して出てきたドキュメントは読みましたか? <<< 環境設定 >>> というセクションの中に [ WindowsNT/2000 の環境設定 ] というものがありましたが。(README-ja.win32というファイル) さて、エラーとなっているputenv()がなにものかは調べましたか? glibc向けの環境変数設定用の関数です。 cygwin環境でなければWindowsではまず使えないでしょう。 _putenv()という代替関数ならあるようです。 # まぁ、本来なら付属ドキュメントの「環境設定」に従うべきでしょう。 # kakasi、および辞書がドコにインストールされるかは固定できない(ユーザーが任意に設定できる)のですから。 あと… >HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); はおそらくNULL返却されますので、以降のGetProcAddress()も失敗します。

hatokamome
質問者

お礼

ご回答ありがとうございます。 すみません。 もう少し調べてから質問すればよかったです。 でも、勉強にありました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C/C++で漢字の読みを取得したいです。

    C/C++で漢字の読みを取得したいです。 以下のコードで、エラーと警告は出ないのですが、実行時エラーになします。 実行時エラー:○○.exeは動作を停止しました。 どこが問題なのか解りません。 漠然としていて申し訳ありませんが、 ライブラリというものが何なのか解っていない初心者です。 Windouwsで設定も含めて、手順を教えていただけませんでしょうか。 おそらくひとつの回答では文字数が足りない程のだと思いますので、絞ると 1.libkakasi.hやkakasi.libなどの必要ファイルの置く場所 2.プロジェクトの設定 3.ソースコード を教えていただきたいです。 まずは動かしたいので理論的なことは後で調べようと思います。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );; char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("文"); printf("%s\n", hiragana); printf("%s\n", "a"); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); } /* 1>------ ビルド開始: プロジェクト: oto_0714, 構成: Debug Win32 ------ 1>コンパイルしています... 1>oto_0714.cpp 1>リンクしています... 1>マニフェストを埋め込んでいます... 1>ビルドログは "file://c:\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\Debug\BuildLog.htm" に保存されました。 1>oto_0714 - エラー 0、警告 0 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== */

  • 漢字の読みを表示するプログラム

    漢字の読みを表示するプログラム C/C++で漢字の読みを取得したいです。 kakasiを利用してみましたが、以下のようなエラーになってしまいます。 エラー内容:実行時エラーで、「○○.exeは動作を停止しました。」となります。 OS:Vistaです。 環境変数はマニュアル通りに設定しました。 ソースはネット上のサンプルを参考に書きましたが、 LoadLibrary・GetProcAddressなどの関数の意味がmsdnを見ても解りませんでした。 (環境変数に設定しない場合の書き方なのかもしれないと思い、消してみましたが、 そうすると多数のコンパイルエラーになってしまいます。) まずは動かしてみたいのです。よろしくお願いいたします。 以下エラーが出るソースです。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" ); char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); putenv( "ITAIJIDICTPATH=C:\\kakasi\\share\\kakasi\\itaijidict"); putenv( "KANWADICTPATH=C:\\kakasi\\share\\kakasi\\kanwadict"); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("漢字"); printf("%s\n", hiragana); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); }

  • 上手く表示できない。(C言語)

    お世話になります。capeofdragonと申します。 Visual Studio 2008 ProでC言語を書いたのですが、 上手く表示されません。 やりたいことは、 256と言う、int型の値を、十分の一倍し、 25.6 と言う、文字列に置き換えて、 文字列として表示させることです。 以下にソースを添付します。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> char *ftoa(int num) { char Num[10]; char rNum[10]; char decimal1[1]; char integer[2]; _itoa_s(num, Num, 10); integer[0] = Num[0]; integer[1] = Num[1]; decimal1[0] = Num[2]; if(integer[0] == '0') { rNum[0] = integer[1]; rNum[1] = '.'; rNum[2] = decimal1[0]; return rNum; } else { rNum[0] = integer[0]; rNum[1] = integer[1]; rNum[2] = '.'; rNum[3] = decimal1[0]; return rNum; } } int _tmain(int argc, _TCHAR* argv[]) { char *pWk; int a = 256; pWk = ftoa(a); printf("pWk = %s\n",pWk); return 0; } コンパイルすると、 pWk =  と表示され、 pWk = 25.6 と表示されません。 また、sprintfを使いたいのですが、 高速化のために、キャラクター操作とかけ算、シフトレジスタなどだけで シンプルに作成したいと考えています。 お手数をお掛け致しますが、 ご教授宜しくお願い致します。

  • VisualStudio C++の初期設定で困っています。

    Visual Studio C++でOpenCVを使って、画像処理系のプログラムの練習をしています。 家のパソコンは初期のvistaを使っていてそこでは出来たんですが、 2台目のWindows7搭載型のノートではエラーが出て進みません。 エラー内容は fatal error LNK1104:ファイル'highgui.h'を開くことができません。 とでます。 ソースは #include "highgui.h" #include "cv.h" int main(int argc, char** argv){ cvNamedWindow("sample"); IplImage* src = cvLoadImage("sample.jpg"); cvShowImage("sample",src); cvReleaseImage( &src ); cvDestroyWindow("sample"); } 開発環境が7の64ビットに変わったからっていうのもあるのかと思っていますが、よくわかりません。エラーの内容で検索をかけてやってみたのですが、いまいちわからなかったので質問させてもらいました。よろしくお願いします。

  • Visial C++におけるプログラミング

    Visial C++ 2008を使用したプログラミングについてです。 学校の課題をやるためやむなくVisial C++2008を使用していて 学校では実行が出来たのに家では出来ませんでした。 ソースファイルは以下のとおりです。 #include <stdio.h> #include <stdlib.h> #include <time.h> /*構造体宣言*/ struct Students{ int N; int A; int B; int C; }; int main(void){ struct Students std[50]; /*構造体型配列*/ int i,N,A,B,C,num,scannum; srand((unsigned)time(NULL)); /*乱数の初期化*/ FILE *file; /*ファイルのポインタを用意*/ file=fopen("Data.txt","r"); /*Dataファイルの読み込み*/ /*ファイルのオープンチェック*/ if(file==NULL){ fprintf(stderr,"cannnot open file 'Data.txt'\n"); exit(1); } /*Studentsにデータを格納*/ for(i=0;i<=49;i++){ fscanf(file,"%d%d%d",&N,&A,&B); std[i].N=N; std[i].A=A; std[i].B=B; std[i].C=70+(rand()/(RAND_MAX+1.0)*31); /*表示*/ printf("学籍番号:%d.",std[i].N); printf("科目A:%d.\n",std[i].A); printf("科目B:%d.\n",std[i].B); printf("科目C:%d.\n",std[i].C); } fclose(file); return 0; } エラーとしては 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(21) : error C2275: 'FILE' : この型は演算子として使用できません 1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(69) : 'FILE' の宣言を確認してください。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(21) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(23) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(23) : warning C4047: '=' : 間接参照のレベルが 'int' と 'FILE *' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(26) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(26) : warning C4047: '==' : 間接参照のレベルが 'int' と 'void *' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : warning C4047: '関数' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(32) : warning C4024: 'fscanf' : の型が 1 の仮引数および実引数と異なります。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(36) : warning C4244: '=' : 'double' から 'int' への変換です。データが失われる可能性があります。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : error C2065: 'file' : 定義されていない識別子です。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : warning C4047: '関数' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 1>c:\documents and settings\devil\my documents\visual studio 2008\projects\テスト\テスト\tt.c(45) : warning C4024: 'fclose' : の型が 1 の仮引数および実引数と異なります。 1>ビルドログは "file://c:\Documents and Settings\devil\My Documents\Visual Studio 2008\Projects\テスト\テスト\Debug\BuildLog.htm" に保存されました。 と表示されます。FILEの宣言をしているのになんで確認してください と出るのでしょうか。。。。解決にご協力お願いします。m(__)m

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • 'strcpy': 識別子が見つかりません

    またもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • 'strcpy': 識別子が見つかりません

    初心者でまたもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • C#からDLLの呼び出し方

    visual studio 2008 express edition C#3.5 を使用しています。 http://www.hata.cc/docs/wlinee/1.html を参考にC++からではMySub関数を呼び出すことができたのですが、 C#から呼び出そうと次のように記述したのですが、 [System.Runtime.InteropServices.DllImport("a.dll")] extern int WINAPI MySub(int a, int b); 書き終わったときに、MySubの下に赤線がでて「;が必要です」 というエラーが出てしまいます・・・ たぶん「WINAPI」が認識されてないと思うのですが、 どのように記述すればよいのでしょうか? ~C++での記述~ [dllcall.cpp] #include "stdafx.h" #include <windows.h> #include <conio.h>  // getch( ) を使用するのに必要 extern int WINAPI MySub(int a, int b); int _tmain(int argc, _TCHAR* argv[]) { int c; c=MySub(9, 3); printf("ans=%d\n",c); getch();// キーが押されるまで待つ return 0; } [a.cpp] __declspec(dllexport)int WINAPI MySub(int a, int b) { return a-b; }

  • OpenCVでの画像サイズ取得について教えてください。

    OpenCVでの画像サイズ取得について教えてください。 rawデータをjpgにして取得し、その画像を4分割したいのですがエラーが3つ出てしまいます。 環境はVisual Studio2008です。 いろいろと調べたのですが、原因や対策がはっきりわからず、書き変えてもNGで困っています。 エラー:その1 「error LNK2028:未解決のトークン(0A00007B)"extern "C" struct IplImage *_cdecl cvLoadImage(char const roi.obj*.int)"(cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int _codecl main(int,char * *)"(?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その2 「error LNK2019: 未解決の外部シンボル"extern "C" struct IplImage * codecl cvLoadImage(char const *.int)" (?cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int_codecl main(int, char * *)" (?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その3 「fatal error LNK1120: 外部参照2が未解決です] '================== #pragma warning(disable : 4819) #include <cv.h> #include <highgui.h> #include <stdio.h> #define DIVX (4) #define DIVY (4) #define DIVXY (DIVX*DIVY) int main (int argc, char **argv) { int w, h IplImage *img=0; img=cvLoadImage("C:\・・・\\testfile.jpg, CV_LOAD_IMAGE_GRAYSCALE); w = img->width - img->width % DIVX + DIVX; h = img->height - img->height % DIVY + DIVY; printf("幅は%w, 高さは%h です。 \n"); } '=============================================== 画像サイズを取得し、画像を4分割したあと、画素値を変更したいと思っています。 できればjpgに変換せず、rawデータそのものの精度の画像を直接扱いたいのですが、 その場合、cvLoadImageでどう表記すると実現できるのでしょうか。 また、OpenCVのグレースケールは、何チャンネルなのでしょうか。 プログラム経験はありますが、OpenCVを使うため、C言語の勉強も始めたばかりです。 なにか見当違いな質問をしていたら申し訳ありません。 お忙しいところすみませんが、もしどなたか解決策をアドバイスいただける方がいらっしゃると 大変助かります。 どうぞ宜しくお願い致します。