while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;
memset( wk, 0, sizeof(wk) );
while ( *pstr ) {
if (wk[0] != 0x00) {
wk[1] = *pstr;
printf(%s,wk);
memset( wk, 0, sizeof(wk) );
}
else if ((*pstr & 0x80) == 0x80) {
wk[0] = *pstr;
}
else {
printf(%c,*pstr);
}
pstr++;
}
memset( chstr, 0, sizeof(chstr) );
}
最後にもう1パターンです。
これでできないはずはない・・・。
でもこれで出来て解決といえるのか・・・?
> パターン2を試したところ
> tEsカサ ギ1V;6[q50@eARIU
> と言うような結果が返ってきました。
これは変ですね・・・。
普通は文字化けするはづですが・・・。
とすると
_mbsncpy か _mbsinc がおかしい可能性があります。
デバッグで、きちんとコピーされているか?
又、ポインタがきちんとすすんでいるか?
を確認してみたらいいかもしれません・・・。
あーーやっぱりダメです(T_T)
tEsカサ ギ1V;6[q50@eARIGat
結果がこれです。
NGAさん、TAKAさんに
これほどまで考えて頂いているのに。
これはもうプログラムの問題ではないのでしょうか?
近況報告です。
でません。
最後のパターンでもだめだということは、何か他に問題あるとおもいます。
OSはなんなのでしょうか?
又、フォントが壊れているとかの可能性がありますね。
中途半端ですが・・・わからないです・・・。
char chstr[12]; -> chstr[13]
最後にこれだけ試してください。
横から失礼します。
文字列内容から調べてみました。
tEsカサ ギ17;6[R50@eARIGat を16進コードで見ると
74 45 73 83 4A 83 54 20 83 4D 31 82 56 3B 36 5B : tEsカサ ギ17;6[
82 71 35 30 40 65 41 52 49 82 66 82 81 74 : R50@eARIGat
tEsカサ ギ1V;6[q50@eARIGat
74 45 73 83 4A 83 54 20 83 4D 31 56 3B 36 5B 71 : tEsカサ ギ1V;6[q
35 30 40 65 41 52 49 82 66 82 81 74 : 50@eARIGat
これら2つの内容を比較してみると、2箇所 82 というコードが落ちています。
これらがどこで欠落したのかを調べてみてはいかがでしょうか?
① fgets()実行後の chstr の内容
② _mbsncpy() 実行後の mbb_str の内容
③ _mbsinc() 実行後の pstr の内容
これらをバイト単位でダンプしてみるとどこで欠落しているかがはっきりすると思います。
大きなバッファに一度で全て読み込んで
tEsカサ ギ17;6[R50@eARIGat かどうか見てみては?
VCで tEsカサ ギ17;6[R50@eARIGat を書込んでいるテスト用ファイルを
バイナリで開きました。
000000 74 45 73 83 4A 83 54 20 83 4D 31 82 56 3B 36 5B
000010 82 71 35 30 40 65 41 52 49 82 66 82 81 74
makotoさん、同じかどうか見てもらえませんか?
それとファイルパスは間違っていないですよね。
まずデバックをして値の変化をみてみました。
fgets()でchstrに読みこんでいる時点で
すでに V;6[ という値が入ってきていました。
> fgets()でchstrに読みこんでいる時点で
> すでに V;6[ という値が入ってきていました。
この直前のfgets()実行後の chstr を文字列ではなくバイトコードで調べてみるとどうなって
いますか?
もうひとつ確かめてください。
ファイルパスとファイルが壊れていないかの確認です。
char command[256];
sprintf(command, type %s, argv[1]);
system(command); // ①
printf(\n); // ②
これら4行をファイルを開く前に挿入して、①、②はファイルを閉じた後にも追加して実行して
みてください。
このように追加すると、プログラム実行中に、コマンドプロンプト上でテキストファイルを読み
出すシステムコールが実行されます。
ぜひお試しください。
>この直前のfgets()実行後の chstr を文字列ではなくバイトコードで調べてみるとどうなって
いますか?
' '→32
'キ'→-73
'゛'→-34
'1'→49
これの他に-126で''でくくられていない
ゴミのようなものがありました。
> これの他に-126で''でくくられていない
> ゴミのようなものがありました。
これが欠落していた 0x82 の正体です。
このコードと次の'V'(0x56)のコードの2バイトで 7になります。
このように、マルチバイトの1バイト目であるコードで終わっている場合には、それを次の読
み込みの配列のトップにもってくるか、さらに1バイト分だけ読み込んで処理するかなどの対処
をすれば文字化けもなくなるはずです。
> 'キ'→-73
> '゛'→-34
と解釈してはいけません。
73と34の2バイトでギを表しています。
それから、文字コードを見るときは、16進数で表したほうが便利です。
NGAさん、TAKAさん、saraさん。
ありがとうございました。
みなさんのおかげで無事、解決いたしました!
ホントに大感謝です。
お手数をお掛けいたしました。
また何かありましたらよろしくお願いします!
ありがとうございました。