とりあえず,こんなプログラムを書いてみた
#include <stdio.h> #include <stdlib.h> #include <locale> using namespace std; int main(int argc, char *argv[]){ char input[1024]; /* ワイド文字列 : 日本語文字数 + 1 */ wchar_t wbuf[1240]; /* マルチバイトUTF-8 で漢字は3バイト,一文字取るなら 3 + 1 */ char str1[4] = { 0 }; char str2[4] = { 0 }; char gram2[7] = { 0 }; int test = 0; FILE *fp; char * p; map<string, int> m1; map<string, int>::iterator pa; setlocale(LC_ALL,""); printf("file = %s\n", argv[1]); if((fp = fopen(argv[1], "r")) == NULL){ printf("file not found\n"); return(1); }else{ while(!feof(fp)){ if(fgets(input, 1024, fp) != NULL){ p = strchr( input, '\n' ); /* 改行文字があった場合 */ if ( p != NULL ) { /* 改行文字を終端文字に置き換える */ *p = '\0'; } printf("size of input= %d\n", sizeof(input)); printf("strlen of input= %d\n", strlen(input)); if(strlen(input) > 0){ printf("%s\n", input); /* マルチバイト文字列をワイド文字列に変換*/ mbstowcs(wbuf, input, strlen(input)); printf("strlen of wbuf = %d\n", wcslen(wbuf)); while(test < wcslen(wbuf) ){ wctomb(str1,wbuf[test]); wctomb(str2,wbuf[test+1]); sprintf(gram2, "%s%s",str1, str2); /* Windows minGWでは wsprintf とする必要がある */ pa = m1.find(gram2); //出てきた形態素原型は既にマップにあるか? if(pa != m1.end()){ pa->second = pa->second + 1; //二つ目の数値を加算 } else{// マップにないなら,新規にマップに追加 m1.insert(make_pair(gram2, 1)); // 1 は 1個目と言う意味 } test++; } }// while_2 }// _if } //_while_1 pa = m1.begin(); while(pa != m1.end()){ printf("%s = %d\n", (pa->first).c_str(), (pa->second) ); pa++; } }//_else }