- 締切済み
テキストファイルの変換なのですが
課題でドラックアンドドロップされたファイルの文書の全角カタカナを半角カタカナに変換するというソフトが思うとおりに動きません。 ご協力をお願いします。 ファイルの文字コードはS-jisです。 ドラックアンドドロップをしてテキストファイルを読み込むところまではうまくいきました。 テキストファイルを1バイトずつ読み込んで、全角カタカナの領域である「0x83」の判定を読み込むことはできるのですが、それ以降がうまくいきません。 テキストファイルの文字列に関するアドレスに関する知識不足だとは思うのですが、考えても分かりません。 以下に、コードを載せさせていただきますので解決だけでなく改良もあれば教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <mbstring.h> #define BYTE unsigned char char *getStrTailPoint(char *); char *getDotPoint(char *,char *); char* changeCode(int); void StringCat2(char *, char *); void main(int argc,char** argv ) { //tail…パス+ファイル名のENDポイントアドレス //dot…拡張子のポイントアドレス char *tail ; char *dot; //bfp…BaseFilePointAddress //mfp…MakedFilePointAddress FILE *bfp,*mfp; //makedFileName…作られるファイルの名前 char makedFileName[1000]; static int i; //ファイルからの文字を格納する一時格納する変数 char *r,tmp[3]; int p; BYTE q; if(argv[1]!=NULL){ // argv[1]…ドラックアンドドロップされたファイルとパスが格納 //ファイルを開く if(NULL ==(bfp=fopen(argv[1],"r"))) { printf("指定されたファイルを開けません"); getchar(); exit(1); } tail = getStrTailPoint(argv[1]); dot = getDotPoint(argv[1],tail); //makeFileNameに"."までの元の名前を格納 for(i = 0;&argv[1][i]<=dot;i++){ if(&argv[1][i]<dot){ makedFileName[i]=argv[1][i]; }else{ makedFileName[i]='\0'; } } //makeFileNameに"__"と拡張子を挿入 strcat(makedFileName,"__"); strcat(makedFileName,dot); //新規ファイルの作成 if(NULL ==(mfp=fopen(makedFileName,"w"))){ printf("新規ファイルを作れません"); getchar(); exit(1); } //既存ファイルから新規ファイルにテキストをコピー //新規ファイルの全角文字を半角文字へ while((p = fgetc(bfp)) != EOF) { q=(BYTE)p; if(0x83==q){ /*r=changeCode(p); fputs(r,mfp); break;*/ fputc('2',mfp); continue; } fputc(p,mfp); } //ファイルを閉じる fclose(bfp); fclose(mfp); } return ; } /* *getStrTailPoint *文字列のENDポイントアドレスを調べる関数 */ char *getStrTailPoint(char *string){ char *p; int i ; int len = strlen(string); for(i=0;i<=len+1;i++){ if(*string=='\0'){ p=string; return p; } string++; } return string; } /* *getDotPoint *ファイルの拡張子の名前が始まるポイントアドレスを検出する関数 */ char *getDotPoint(char *string,char *tail){ char *p; int i; int len = strlen(string); for(i=0;i<len;i++){ if(*tail=='.'){ p=tail; return p; } tail--; } return tail; } char* changeCode(int ch){ char p[3]; char *zenkaku ={"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ\0"}; char *hankaku ={"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョ\0"}; char *hankaku2 ={"カキクケコサシスセソタチツテト"}; char *hankaku3 ={"ハヒフヘホ"}; char *dakutenn ={"゛゜"}; do{ if(*zenkaku<='ョ'||ch==*zenkaku){ p[0]=*hankaku; p[1]='\0'; return p; break; }else if(ch==*zenkaku){ if(*zenkaku<='ド'){
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kyo-mogu
- ベストアンサー率22% (3398/15358)
この言語は私は分かりませんので具体的に無理ですが、元プログラマーとしてのアドバイスです。 まず、どのようなエラーが出ていますか? 処理のステップ毎に解析してみることも大切です。 コマンドなどで制限があるものは無いか? 扱える文字数や桁数。 操作をしてミスしやすい行動はなにか?それに伴うエラー処理が出来ているか。 全角の中に半角のスペースが混じり込んでいる事は無いか?他の半角文字が入っていないか。入ったとしたら、どのように処理するかなどもエラーに対する処理方法です。 処理の状態を見る。たとえば変数の中身を画面上に表示するようなプログラムを入れてみる。 エラーの状態を細かく分析する。途中まで出来ているのか、全く出来ないのか。処理の手前で変数の名前を間違っている、扱うものが文字なのに数字の物として定義しているなども注意する部分です。 以外と気がつきにくいところです。似たような変数名を使うと間違いやすい。 繰り返し処理を行う場合、終了判定の確認。空白になれば終わりという条件ならば、最初に空白にあたるコードが入っているか。 製品としてする場合、入力された物が何かチェックする処理もあると良い。とんでもない入力や行動が有ったとしてもトラブルが無いように配慮するなどが必要に成ります。 テスト段階での入力データの見直しも大切。特定の文字で成っているかもしれません。 あと、プログラムから全部大丈夫なのにおかしな行動になる場合もある。マシンその物の特性やバグ、OSその物の特性とバグ、コンパイラーなどの以下繰り返し。という事もあります。これが分かっている場合は、その特性を修正するプログラムを入れたりもしますね。 デバッグは自分での思い込みも多いので注意してね。