int main(int argc, char** argv)
{
char fname[68];
char chstr[12];
unsigned char *pstr;
unsigned char mbb_str[3];
int intstr;
FILE* fp;
if(argc < 2 || !(fp = fopen(argv[1], r)))
{
return 2;
}
while(( fgets( chstr,6,fp )) != NULL ){
pstr = (unsigned char *)chstr;
while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
_mbsncpy( mbb_str, pstr, 1);
// intstr = AlphaChange((char *)pstr);//変換処理
// if( intstr == 0){
printf(%s,mbb_str);
// }
pstr = _mbsinc( pstr );
}
}
fclose(fp);
return 0;
}
以上のコードで試すと、
読込ファイル : tEsカサ ギ17;6[R50@eARIGat
出力結果 : tEsカサ ギ17;6[R50@eARIGat
となりましたね。
NGAさんのように
変換をしないでそのまま表示させているのですが
やはり tEsカサ ギ1V;6[q50@eARIGat
のように「V」「q」がでてきてしまいます。
NGAさんのプログラムをそのまま使って
やってみたのですが
それでも同じ結果になってしまいました。
追加で。
while(( fgets( chstr,6,fp )) != NULL ){
で、うまくいったと思っても
読み込み文字数を変えるとまた違った結果になったりします。
文字コード(JIS・S-JIS・EUC・UNICODE)を変えたり、Win98上で動かしてみたりしましたが、
どうしても tEsカサ ギ1V;6[q50@eARIGat を出すことができませんでした。
> makotoさんへ
気になったのでよこからですが、
今のメインのみをもう一度省かず、コピーペーストしてくれませんか?
後、テキストファイルだと思われますが、もう一度作成しなおし、ためしても
だめですか?
バイナリ-EDITもっているなら、tEsカサ ギ17;6[R50@eARIGat
のダンプ等があるとわかりやすいです。
int main(int argc, char* argv[])
{
char fname[68];
char chstr[12];
unsigned char *pstr;
unsigned char mbb_str[3];
FILE *fp;
if (argc == 1) {
printf(ファイル名を入力してください!\n);
printf(ファイル名=);
scanf(%s, fname);
}else{
strcpy(fname, argv[1]);
}
/* ファイルオープン */
fp = fopen(fname, r);
if ( fp == NULL ) {
printf(ファイルオープンに失敗しました);
exit (1);
}
memset( chstr, 0, sizeof(chstr) );
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;
while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
//strncpy( (char *)mbb_str, (char *)pstr,1);
_mbsncpy( mbb_str, pstr, 1);
printf(%s,mbb_str);
pstr = _mbsinc( pstr );
}
memset( chstr, 0, sizeof(chstr) );
}
fclose(fp);
return 0;
}
メインはこれです。
テキストファイルは作りなおしてみましたが
やはり結果は同じでした。
なにか原因があるのでしょうか?
う~む、でませんねぇ。
makotoさんの方法で注意しなければいけない点は、ファイルから読み込んだ時に
全角文字が先行バイトと後続バイトに分断された場合のみくらいかと考えていましたが。
> makotoさんの方法で注意しなければいけない点は、ファイルから読み込んだ時に
> 全角文字が先行バイトと後続バイトに分断された場合のみくらいかと考えていましたが。
私もそう思いメインを出してもらったのですが出ませんでした。
> while(( fgets( chstr, 6, fp )) != NULL ){
> pstr = (unsigned char *)chstr;
>
> while ( *pstr ) {
> memset( mbb_str, 0, sizeof( mbb_str ));
> //strncpy( (char *)mbb_str, (char *)pstr,1);
> _mbsncpy( mbb_str, pstr, 1);
>
> printf(%s,mbb_str);
>
> pstr = _mbsinc( pstr );
> }
> memset( chstr, 0, sizeof(chstr) );
> }
ためしですが、下記の2パターンにこの部分を変えてみてください
パターン1:
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;
printf(%s,pstr);
memset( chstr, 0, sizeof(chstr) );
}
パターン2:
char wk[3];
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;
memset( wk, 0x00, sizeof( wk ));
while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
//strncpy( (char *)mbb_str, (char *)pstr,1);
_mbsncpy( mbb_str, pstr, 1);
if (wk[0] != 0x00) {
wk[1] = mbb_str;
printf(%s,wk);
memset( wk, 0, sizeof( wk ));
}
else if ((mbb_str & 0x80) == 0x80) {
wk[0] = mbb_str;
}
else {
printf(%s,mbb_str);
}
pstr = _mbsinc( pstr );
}
memset( chstr, 0, sizeof(chstr) );
}
すみませんパターン2ですが、
mbb_str -> mbb_str[0]
としてください。
多分動かないとおもうのですが・・・。
パターン2の
else if ((mbb_str & 0x80) == 0x80) {
で以下のようなエラーが出ました。
error C2296: '&' : 不正な左オペランドです。
>パターン2の
>else if ((mbb_str & 0x80) == 0x80) {
>で以下のようなエラーが出ました。
>
>error C2296: '&' : 不正な左オペランドです。
これもTAKAさんが一つ上で書いているように修正ですか?
>mbb_str -> mbb_str[0]
これはどこと置きかえるのですか?
すみません上にも書きましたが、
mbb_str -> mbb_str[0]
としてください。
又、wk はunsigned char でお願いしますm(__)m
if (wk[0] != 0x00) {
wk[1] = mbb_str[0];
printf(%s,wk);
memset( wk, 0, sizeof( wk ));
}
else if ((mbb_str[0] & 0x80) == 0x80) {
wk[0] = mbb_str[0];
}
else {
printf(%s,mbb_str);
}
です。たびたびすみません。
パターン2を試したところ
tEsカサ ギ1V;6[q50@eARIU
と言うような結果が返ってきました。
やはり同じようなところで違う結果が返ってきています。
むー。なぜ??