• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ダンププログラムの結果表示で2バイトの場合)

2バイトの場合のダンププログラム結果表示

このQ&Aのポイント
  • ダンププログラムを使ってファイルの結果を表示する際、2バイトのデータ(漢字、全角文字など)が正しく表示されない問題が発生しています。
  • 改行前に2バイト目を表示したい場合、どのようにすればよいですか?
  • 解決方法を含めて詳しく教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208507
noname#208507
回答No.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 に退避したバイトを全て出力する. というような感じで.

momoiropuccho
質問者

お礼

mbtowcという関数があること自体知らなかったので大変勉強になりました。 ご教授いただいたようなやり方でプログラムを組んでみたところ、 正常にテキストが表示されるようになりました。 回答ありがとうございました。

その他の回答 (2)

回答No.2

テキストの表示がどの程度重要かによっても扱いが違ってきますね。 文字のコード系でも違ってきますから一般解は有りません。 考えられる手法としては 最後の1バイトが2バイトコードの先頭だったとき a 2バイト目も出力する。 b 非表示文字として扱う 次の行の先頭バイトを イ 空白その他の記号に置き換えて2バイト目で有ることを表示 ロ 非表示文字として扱う ハ 2バイトコードの先頭または1バイトコードの文字として扱う の組み合わせですね。

momoiropuccho
質問者

お礼

テキストの表示はかなり重要視しています。 考え方のご教授ありがとうございました。 だいぶプログラムのヒントになりました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>改行前に2バイト目を表示したいのですがどうしたらよろしいでしょうか。 改行前に2バイト目を読んで出力すればいいだけでは? でもダンプするのがテキストファイルだけならともかく バイナリファイルもダンプするつもりなら気にするだけ無駄だと思う。

momoiropuccho
質問者

お礼

確かにバイナリファイルのことを考えるとあまり意味なさそうですが、 一応テキストファイルの時だけでも正常に表示させたいなと思いまして。 回答ありがとうございました。