重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

#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と表示させる為にはどうしたらいいですか?

A 回答 (10件)

#8>fprintf(fp , "0x%02x" , wbuf[0]);


#8>のみしか実現できないっぽいですかね^^;
テキストファイルに、テキストとして0x00と表示するなら
これでいいと思います。

この回答への補足

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

補足日時:2006/06/22 09:05
    • good
    • 0

後半の話で



0x00~0x1fあたりまでは、コントロールキャラクタであり、通常のテキストエディタでは、表示されない(スペースになったり、□になったり、エディタによる)文字になります。いい加減な作りのエディタだと画面がぐちゃぐちゃになったり、誤動作するかもしれません。

たとえば、0x09はタブですから、普通のエディタならタブとして動作してしまいます。

http://ash.jp/code/ctrltbl.htm

バイナリエディタか、バイナリモードをサポートするエディタを使ってください。

あと、%sの変換では、JISやASCIIのコード系を使っている限り0x00は出力できません、何故かは、ASCIZをキーワードで検索してみてください。

この回答への補足

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

補足日時:2006/06/22 09:05
    • good
    • 0

回答は既にでているので、


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

この回答への補足

>この様にファイルがオープンできるかどうかチェックしているなら
>下に抜けないようにしないと意味がありません。
はい。
下に抜けているか確認してます。

fprintf(fp , "0x%02x" , wbuf[0]);
のみしか実現できないっぽいですかね^^;

補足日時:2006/06/20 13:48
    • good
    • 0

# 大嘘書きました…orz



文字で書くなら%cってのもありですね。
文字列で16進表示したいなら%xですね。0xはつけてあげてください。
    • good
    • 0

よくわからない部分もありますが…



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);
・・・・
こちらの方は使用できないみたいです><

補足日時:2006/06/20 13:40
    • good
    • 0

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など入っている値を見たいのです。

補足日時:2006/06/20 13:29
    • good
    • 0

ファイルに1文字を出力するのであれば、書式指定子が間違っています。



fprintf(fp, "%c", wbuf[0]);
です。
"%s" だと、「0 番地から始まる文字列」を強引に書き出してしまいます。

また、ファイルオープンのテキストモード/バイナリモードは、改行コードの取り扱いの違いを吸収するためのもので、今回のことに関しては、あるいは、改行コードを使わない、あるいは、'\n' という表現を使わないのであれば、どちらでも違いはありません。
    • good
    • 0

wbuf[0] は、UCHAR型。


%s は文字列の指定。
型が不一致です。

'0x00'にしたいなら、バイナリで
fwrite(wbut, 1, 1, fp); とか書いてみる。

"0x00"にしたいなら、%sではなくて%uでしょうか。

この回答への補足

回答ありがとうございます。

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

補足日時:2006/06/20 13:22
    • good
    • 0

if((fp=fopen("test.txt", "wb"))==NULL){



バイナリモードでオープンです

この回答への補足

回答ありがとうございます。

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

補足日時:2006/06/20 13:18
    • good
    • 0

if((fp=fopen("test.txt", "wb"))==NULL){



のほうがいいかな

この回答への補足

回答ありがとうございます。

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

補足日時:2006/06/20 13:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!