- ベストアンサー
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と表示させる為にはどうしたらいいですか?
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
#8>fprintf(fp , "0x%02x" , wbuf[0]); #8>のみしか実現できないっぽいですかね^^; テキストファイルに、テキストとして0x00と表示するなら これでいいと思います。
その他の回答 (9)
- ultraCS
- ベストアンサー率44% (3956/8947)
後半の話で 0x00~0x1fあたりまでは、コントロールキャラクタであり、通常のテキストエディタでは、表示されない(スペースになったり、□になったり、エディタによる)文字になります。いい加減な作りのエディタだと画面がぐちゃぐちゃになったり、誤動作するかもしれません。 たとえば、0x09はタブですから、普通のエディタならタブとして動作してしまいます。 http://ash.jp/code/ctrltbl.htm バイナリエディタか、バイナリモードをサポートするエディタを使ってください。 あと、%sの変換では、JISやASCIIのコード系を使っている限り0x00は出力できません、何故かは、ASCIZをキーワードで検索してみてください。
補足
回答ありがとうございます。 調べてみます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
回答は既にでているので、 他の部分で >if((fp=fopen("test.txt", "w"))==NULL){ > printf("open error\n"); >} この様にファイルがオープンできるかどうかチェックしているなら 下に抜けないようにしないと意味がありません。
補足
>この様にファイルがオープンできるかどうかチェックしているなら >下に抜けないようにしないと意味がありません。 はい。 下に抜けているか確認してます。 fprintf(fp , "0x%02x" , wbuf[0]); のみしか実現できないっぽいですかね^^;
- MrBan
- ベストアンサー率53% (331/615)
# 大嘘書きました…orz 文字で書くなら%cってのもありですね。 文字列で16進表示したいなら%xですね。0xはつけてあげてください。
- m_mik
- ベストアンサー率26% (31/117)
よくわからない部分もありますが… 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を書き込めます。 (エラー処理は省いています)
補足
fprintf(fp , "0x%2x" , wbuf[0]); ↓ fprintf(fp , "0x%02x" , wbuf[0]); でOKですよね? >int fd; >fd = creat("test.txt" , O_CREAT | O_TRUNC); ・・・・ こちらの方は使用できないみたいです><
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.4 補足です。 もしも、0x00 をファイルの書き込むというのでいいのなら、単純に、 fprintf(fp, "%c", 0x00); でOKです。
補足
#define AAA 0x00 #define BBB 0x01 #define CCC 0x02 などいくつか定数があり、 wbuf[0]には0x00や0x01,0x02など入ります。 この場合にテキストにwbuf[0]に入っている0x00や0x01,0x02を出力して、テキストエディタで開いた時に 0x00や0x01,0x02など入っている値を見たいのです。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
ファイルに1文字を出力するのであれば、書式指定子が間違っています。 fprintf(fp, "%c", wbuf[0]); です。 "%s" だと、「0 番地から始まる文字列」を強引に書き出してしまいます。 また、ファイルオープンのテキストモード/バイナリモードは、改行コードの取り扱いの違いを吸収するためのもので、今回のことに関しては、あるいは、改行コードを使わない、あるいは、'\n' という表現を使わないのであれば、どちらでも違いはありません。
- MrBan
- ベストアンサー率53% (331/615)
wbuf[0] は、UCHAR型。 %s は文字列の指定。 型が不一致です。 '0x00'にしたいなら、バイナリで fwrite(wbut, 1, 1, fp); とか書いてみる。 "0x00"にしたいなら、%sではなくて%uでしょうか。
補足
回答ありがとうございます。 >fwrite(wbut, 1, 1, fp); とか書いてみる。 このように書いてみましたがファイルをテキストエディタで開いた際文字化けしていました^^; テキストで開いて0x00には出来ないのでしょうか?
- bonyamk
- ベストアンサー率29% (49/166)
if((fp=fopen("test.txt", "wb"))==NULL){ バイナリモードでオープンです
補足
回答ありがとうございます。 if((fp=fopen("test.txt", "wb"))==NULL){ にして保存した場合テキストエディタで開いた場合 0x00と表示はされるのでしょうか?
- bonyamk
- ベストアンサー率29% (49/166)
if((fp=fopen("test.txt", "wb"))==NULL){ のほうがいいかな
補足
回答ありがとうございます。 if((fp=fopen("test.txt", "wb"))==NULL){ にして保存した場合テキストエディタで開いた場合 0x00と表示はされるのでしょうか?
補足
回答ありがとうございます。 最終的にfprintf(fp , "0x%02x" , wbuf[0]); でやることにしました^^