• ベストアンサー

0x00をファイル出力

#define TEST 0x00 FILE *fp; UCHAR wbuf[1]; wbuf[0] = TEST; if((fp=fopen("test.txt", "w"))==NULL){  printf("open error\n"); } fprintf(fp,"%s",wbuf[0]); fclose(fp); 以上がプログラムでこれを実行するとtest.txtには 文字化けして書き込まれます。 ファイルに0x00と表示させる為にはどうしたらいいですか?

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.10

#8>fprintf(fp , "0x%02x" , wbuf[0]); #8>のみしか実現できないっぽいですかね^^; テキストファイルに、テキストとして0x00と表示するなら これでいいと思います。

yamadachan
質問者

補足

回答ありがとうございます。 最終的にfprintf(fp , "0x%02x" , wbuf[0]); でやることにしました^^

その他の回答 (9)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.9

後半の話で 0x00~0x1fあたりまでは、コントロールキャラクタであり、通常のテキストエディタでは、表示されない(スペースになったり、□になったり、エディタによる)文字になります。いい加減な作りのエディタだと画面がぐちゃぐちゃになったり、誤動作するかもしれません。 たとえば、0x09はタブですから、普通のエディタならタブとして動作してしまいます。 http://ash.jp/code/ctrltbl.htm バイナリエディタか、バイナリモードをサポートするエディタを使ってください。 あと、%sの変換では、JISやASCIIのコード系を使っている限り0x00は出力できません、何故かは、ASCIZをキーワードで検索してみてください。

yamadachan
質問者

補足

回答ありがとうございます。 調べてみます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

回答は既にでているので、 他の部分で >if((fp=fopen("test.txt", "w"))==NULL){ > printf("open error\n"); >} この様にファイルがオープンできるかどうかチェックしているなら 下に抜けないようにしないと意味がありません。

yamadachan
質問者

補足

>この様にファイルがオープンできるかどうかチェックしているなら >下に抜けないようにしないと意味がありません。 はい。 下に抜けているか確認してます。 fprintf(fp , "0x%02x" , wbuf[0]); のみしか実現できないっぽいですかね^^;

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.7

# 大嘘書きました…orz 文字で書くなら%cってのもありですね。 文字列で16進表示したいなら%xですね。0xはつけてあげてください。

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.6

よくわからない部分もありますが… fprintf(fp,"%s",wbuf[0]); では、文字列をファイルへ出力しようとしています。 もし、ファイルに「0x00」という文字列を出力したいということでしたら、 fprintf(fp , "0x%2x" , wbuf[0]); ということになります。 そうではなく、ファイルに0x00という値を出力したいのでしたら話がちょっと変わってきます。 文字列の終端はNUL文字ですから、先頭がNUL文字(0x00)ですので、何も出力されません。 fprintf()を使わずに、write()を使用した方が良いと思います。 int fd; fd = creat("test.txt" , O_CREAT | O_TRUNC); write(fd , wbuf , 1); close(fd); とすると、0x00を書き込めます。 (エラー処理は省いています)

yamadachan
質問者

補足

fprintf(fp , "0x%2x" , wbuf[0]); ↓ fprintf(fp , "0x%02x" , wbuf[0]); でOKですよね? >int fd; >fd = creat("test.txt" , O_CREAT | O_TRUNC); ・・・・ こちらの方は使用できないみたいです><

回答No.5

No.4 補足です。 もしも、0x00 をファイルの書き込むというのでいいのなら、単純に、 fprintf(fp, "%c", 0x00); でOKです。

yamadachan
質問者

補足

#define AAA 0x00 #define BBB 0x01 #define CCC 0x02 などいくつか定数があり、 wbuf[0]には0x00や0x01,0x02など入ります。 この場合にテキストにwbuf[0]に入っている0x00や0x01,0x02を出力して、テキストエディタで開いた時に 0x00や0x01,0x02など入っている値を見たいのです。

回答No.4

ファイルに1文字を出力するのであれば、書式指定子が間違っています。 fprintf(fp, "%c", wbuf[0]); です。 "%s" だと、「0 番地から始まる文字列」を強引に書き出してしまいます。 また、ファイルオープンのテキストモード/バイナリモードは、改行コードの取り扱いの違いを吸収するためのもので、今回のことに関しては、あるいは、改行コードを使わない、あるいは、'\n' という表現を使わないのであれば、どちらでも違いはありません。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

wbuf[0] は、UCHAR型。 %s は文字列の指定。 型が不一致です。 '0x00'にしたいなら、バイナリで fwrite(wbut, 1, 1, fp); とか書いてみる。 "0x00"にしたいなら、%sではなくて%uでしょうか。

yamadachan
質問者

補足

回答ありがとうございます。 >fwrite(wbut, 1, 1, fp); とか書いてみる。 このように書いてみましたがファイルをテキストエディタで開いた際文字化けしていました^^; テキストで開いて0x00には出来ないのでしょうか?

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.2

if((fp=fopen("test.txt", "wb"))==NULL){ バイナリモードでオープンです

yamadachan
質問者

補足

回答ありがとうございます。 if((fp=fopen("test.txt", "wb"))==NULL){ にして保存した場合テキストエディタで開いた場合 0x00と表示はされるのでしょうか?

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.1

if((fp=fopen("test.txt", "wb"))==NULL){ のほうがいいかな

yamadachan
質問者

補足

回答ありがとうございます。 if((fp=fopen("test.txt", "wb"))==NULL){ にして保存した場合テキストエディタで開いた場合 0x00と表示はされるのでしょうか?

関連するQ&A

専門家に質問してみよう