ファイルの読み込み – 固定ページ 3 – プログラミング – Home

通知
すべてクリア

[解決済] ファイルの読み込み

固定ページ 3 / 5

TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

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パターンです。
これでできないはずはない・・・。
でもこれで出来て解決といえるのか・・・?


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

> パターン2を試したところ
> tEsカサ ギ1V;6[q50@eARIU
> と言うような結果が返ってきました。

これは変ですね・・・。
普通は文字化けするはづですが・・・。

とすると
_mbsncpy か _mbsinc がおかしい可能性があります。
デバッグで、きちんとコピーされているか?
又、ポインタがきちんとすすんでいるか?
を確認してみたらいいかもしれません・・・。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

あーーやっぱりダメです(T_T)

tEsカサ ギ1V;6[q50@eARIGat
結果がこれです。

NGAさん、TAKAさんに
これほどまで考えて頂いているのに。
これはもうプログラムの問題ではないのでしょうか?


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

近況報告です。
でません。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

最後のパターンでもだめだということは、何か他に問題あるとおもいます。
OSはなんなのでしょうか?
又、フォントが壊れているとかの可能性がありますね。
中途半端ですが・・・わからないです・・・。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

char chstr[12]; -> chstr[13]
最後にこれだけ試してください。


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

横から失礼します。
文字列内容から調べてみました。

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 の内容

これらをバイト単位でダンプしてみるとどこで欠落しているかがはっきりすると思います。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

大きなバッファに一度で全て読み込んで
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さん、同じかどうか見てもらえませんか?
それとファイルパスは間違っていないですよね。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

まずデバックをして値の変化をみてみました。

fgets()でchstrに読みこんでいる時点で
すでに V;6[ という値が入ってきていました。


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

> fgets()でchstrに読みこんでいる時点で
> すでに V;6[ という値が入ってきていました。
この直前のfgets()実行後の chstr を文字列ではなくバイトコードで調べてみるとどうなって
いますか?


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

もうひとつ確かめてください。
ファイルパスとファイルが壊れていないかの確認です。

char command[256];
sprintf(command, type %s, argv[1]);
system(command); // ①
printf(\n); // ②

これら4行をファイルを開く前に挿入して、①、②はファイルを閉じた後にも追加して実行して
みてください。

このように追加すると、プログラム実行中に、コマンドプロンプト上でテキストファイルを読み
出すシステムコールが実行されます。

ぜひお試しください。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

>この直前のfgets()実行後の chstr を文字列ではなくバイトコードで調べてみるとどうなって
いますか?

' '→32
'キ'→-73
'゛'→-34
'1'→49 

これの他に-126で''でくくられていない
ゴミのようなものがありました。


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

> これの他に-126で''でくくられていない
> ゴミのようなものがありました。

 これが欠落していた 0x82 の正体です。
 このコードと次の'V'(0x56)のコードの2バイトで 7になります。
 このように、マルチバイトの1バイト目であるコードで終わっている場合には、それを次の読
み込みの配列のトップにもってくるか、さらに1バイト分だけ読み込んで処理するかなどの対処
をすれば文字化けもなくなるはずです。


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

> 'キ'→-73
> '゛'→-34

と解釈してはいけません。
73と34の2バイトでギを表しています。
それから、文字コードを見るときは、16進数で表したほうが便利です。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

NGAさん、TAKAさん、saraさん。
ありがとうございました。

みなさんのおかげで無事、解決いたしました!
ホントに大感謝です。
お手数をお掛けいたしました。

また何かありましたらよろしくお願いします!
ありがとうございました。


返信引用
固定ページ 3 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました