[[Programming]] とりあえず,こんなプログラムを書いてみた #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <string.h> #include <limits.h> #include <locale> #include <map> #include <iostream> using namespace std; int main(int argc, char *argv[]){ char input[1024]; /* ワイド文字列 : 日本語文字数 + 1 */ 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; /* マルチバイトUTF-8 で漢字は3バイト,一文字取るなら 3 + 1 */ char str1 [MB_LEN_MAX + 1]; // [4] = { 0 }; char str2 [MB_LEN_MAX + 1]; // [4] = { 0 }; char gram2 [7] = { 0 }; int i, 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"); printf("file not found\n"); return(1); }else{ }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); p = strchr( input, '\n' ); /* 改行文字があった場合 */ if ( p != NULL ) { /* 改行文字を終端文字に置き換える */ *p = '\0'; } /* マルチバイト文字列をワイド文字列に変換*/ 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; //二つ目の数値を加算 printf("size of input= %lu\n", sizeof(input)); printf("strlen of input= %lu\n", strlen(input)); if(strlen(input) > 0){ printf("%s\n", input); /* マルチバイト文字列をワイド文字列に変換*/ mbstowcs(wbuf, input, strlen(input)); printf("strlen of wbuf = %lu\n", wcslen(wbuf)); while(test < wcslen(wbuf) ){ /* ワイド文字列をマルチバイト文字列に変換*/ i = wctomb(str1,wbuf[test]); str1 [i] = '\0'; cout << "str1 = " << i << " = " << str1 << endl; i = wctomb(str2,wbuf[test+1]); str2 [i] = ' \0'; cout << "str2 = " << i << " = " << str2 << endl; 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++; } else{// マップにないなら,新規にマップに追加 m1.insert(make_pair(gram2, 1)); // 1 は 1個目と言う意味 } test++; } }// while_2 }// _if } //_while_1 pa = m1.begin(); }// _if } //_while_1 pa = m1.begin(); while(pa != m1.end()){ printf("%s = %d\n", (pa->first).c_str(), (pa->second) ); pa++; } }//_else }//_else } //#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 //} // _end_main