テキストファイルの変換なのですが
課題でドラックアンドドロップされたファイルの文書の全角カタカナを半角カタカナに変換するというソフトが思うとおりに動きません。
ご協力をお願いします。
ファイルの文字コードは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<='ド'){
お礼
すみません、間違えました。そのアーカイブファイルができないのです。なぜでしょうか?