- ベストアンサー
2バイトの場合のダンププログラム結果表示
- ダンププログラムを使ってファイルの結果を表示する際、2バイトのデータ(漢字、全角文字など)が正しく表示されない問題が発生しています。
- 改行前に2バイト目を表示したい場合、どのようにすればよいですか?
- 解決方法を含めて詳しく教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
関数 mbtowc の戻り値が利用できるかもしれません。 例えば 1.16進数の出力の後,文字を表示するループの前に,バッファ中の表示可能な範囲をチェックするループを入れる. ・buf を1バイトずつ mbtowc() でチェックする. ・変数 s = 印字可能な最初の文字の,最初のバイトのインデックス番号. ・変数 t = 印字可能な最後の文字の,最後のバイトのインデックス番号+1. (s は mbtowc() の戻り値が正の数かどうかで,t は mbtowc() の戻り値とその時のインデックス番号の加算で求めることができるでしょう) 2.次に文字を表示するループ.buf とは別に退避用のバッファ tmp を用意しておく.下記は値が 0x20 より大きいバイトについて. ・s 番目以降かつ t より前のバイトは,1つずつ putchar() で出力する. ・t 番目以降のバイトは,1つずつ tmp にコピーする. ・s 番目より前のバイトは,1つずつ putchar() で出力する.ただし 0 番目のバイトを出力する前に tmp に退避したバイトを全て出力する. というような感じで.
その他の回答 (2)
- TooManyBugs
- ベストアンサー率27% (1472/5321)
テキストの表示がどの程度重要かによっても扱いが違ってきますね。 文字のコード系でも違ってきますから一般解は有りません。 考えられる手法としては 最後の1バイトが2バイトコードの先頭だったとき a 2バイト目も出力する。 b 非表示文字として扱う 次の行の先頭バイトを イ 空白その他の記号に置き換えて2バイト目で有ることを表示 ロ 非表示文字として扱う ハ 2バイトコードの先頭または1バイトコードの文字として扱う の組み合わせですね。
お礼
テキストの表示はかなり重要視しています。 考え方のご教授ありがとうございました。 だいぶプログラムのヒントになりました。
- wormhole
- ベストアンサー率28% (1626/5665)
>改行前に2バイト目を表示したいのですがどうしたらよろしいでしょうか。 改行前に2バイト目を読んで出力すればいいだけでは? でもダンプするのがテキストファイルだけならともかく バイナリファイルもダンプするつもりなら気にするだけ無駄だと思う。
お礼
確かにバイナリファイルのことを考えるとあまり意味なさそうですが、 一応テキストファイルの時だけでも正常に表示させたいなと思いまして。 回答ありがとうございました。
お礼
mbtowcという関数があること自体知らなかったので大変勉強になりました。 ご教授いただいたようなやり方でプログラムを組んでみたところ、 正常にテキストが表示されるようになりました。 回答ありがとうございました。