• ベストアンサー

fwriteでの書き込み

16進の数値をバイナリとしてファイルに書き込みたいのですが、 以下のようなプログラムで書き込んで、できたファイルを16進に 直して見てみると、  ff ff 00 00 aa ff 00 00 となっていて、途中に0000が入ってしまうのです。 16進に直して見たときに  ff ff aa ff cc 55 22 22 となるようにしたいのですが、どこがまちがっているのでしょうか? int main(void){ long *i; FILE *fp1; fp1=fopen("test.dat","w"); i[0]=0xffff; i[1]=0xffaa; i[2]=0x55cc; i[3]=0x2222; fwrite(i,2,4,fp1)); fclose(fp1); return 0; }

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

  • ベストアンサー
回答No.3

#2の方、おしい... エンディアン(endian)はマシン(プロセッサ)アーキテクチャに依存します。 オペレーティングシステムに依存するわけではありません。 Windowsが動くマシンがIntelのPentiumというプロセッサで、x86と呼ばれるアーキテクチャがリトルエンディアンを採用しているからです。 質問者の方は、リトルエンディアンとかビッグエンディアンとかいうのはご存知ですかね? でも、質問内容では気になさってないようですね。(自然とリトルエンディアンであることを受け入れていらっしゃる...) では、質問の直接の回答を... 4バイトの型であるlongをご使用になっているのを、2バイトの型であるshortにします。 でも...このプログラムどうして動くのか不思議ですよ。 データを格納する配列 i[]は定義されていない、定義されているのはポインタの i ですから。(ポインタで定義されているiに対して、i[n]という使い方が誤っているというつもりではありません。Cの言語仕様はそれを認めています。) 動いているとすれば、自動変数であるポインタ i の初期化がされていないので、きっと不定のメモリに、0x0000ffffなどを書き込んで、しかも、ランタイムエラーとならない...ただの偶然ですよ。 ということで、目的とすることをなさるには、 unsigned short i[4]; <途中省略> fwrite(&i[0], 2, 4, fp1); とするのが正解です。 参考になれば。

moby2002
質問者

お礼

ありがとうございました。

その他の回答 (2)

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんちには、honiyonです。   以下の2点がミソです。    ・long型は 4byte    ・Windowsはスモールインディアン   Windowsはスモールインディアンなので、ファイルにデータを書き込むと上位ビットと下位ビットが逆になって保存されます。(スモールインディアンの詳細が知りたい場合は別途調べてみてください。)   つまり、0xffffというデータは、long型では、0000 ffff (4byte)と表せます。これをファイルに保存すると、上位ビットと下位ビットが逆転し、ffff 0000 というデータが保存されます。   もし、ffffだけ保存したいなら、2byteのデータ型を使うと良いと思います。   確かsmallint型が2byteだったような・・・ってsmallintってDelphiの型だったかな?(汗 ここは自身無しでお願いします(^^;   参考になれば幸いです(..

moby2002
質問者

お礼

endianの言葉を始めて知りました。 新しい知識が増えました! ありがとうございました。

noname#4564
noname#4564
回答No.1

  > 16進の数値をバイナリとしてファイルに書き込みたいのですが、 > 以下のようなプログラムで書き込んで、できたファイルを16進に > 直して見てみると、 > >  ff ff 00 00 aa ff 00 00 > > となっていて、途中に0000が入ってしまうのです。 > 16進に直して見たときに > >  ff ff aa ff cc 55 22 22 > > となるようにしたいのですが、どこがまちがっているのでしょうか? 逆質問です。 (1) ご使用の開発環境(コンパイラ)は何でしょうか? (2) ご使用の環境でsizeof(long)はいくつになりますか? (3) エンディアンの違いは考慮しなくてもよいのですか? # C言語はよく知らないので、他の方のフォローを希望 (^人^;;  

moby2002
質問者

お礼

shortにするといいということですね!

関連するQ&A

  • fwriteについて

    #include<stdio.h> int main(void) { FILE* fp; double f[5]={ 3.1, 2.9, 4.2, 3.7, 4.0}; double data; fp=fopen("test.txt","wb"); if(fp==NULL) { printf("text.txtが開けません。"); return 0; } fwrite(f,sizeof(double),5,fp); fclose(fp); }と入力したのでが、test.txtファイルを見ると 文字化けがでて、数値がわかりません。 数値もテキストファイルに出力する方法があったらご教授よろしくお願いします。できたらなぜこのようなことが起きたのか教えてくださるとうれしいです。

  • fread(),fwrite()等について

    私は現在、C言語のストリームというところを勉強中で、その中でfopen()やfread(),fwrite()といった関数の使い方の例が参考書に書いてあるのですが、結果が上手く表示されず困っています。次にプログラムの説明と、ソースを載せています。 <説明> 10個の要素を持つ配列を浮動小数点数で埋め、それらをファイルに書き込み再び読み込みます。このプログラムは配列の要素を1つずつ書き込みます。 #include <stdio.h> #include <stdlib.h> double d[10] = { 10.2, 5.3, 7.91, 1.23, 7.7, 6.4, 89.12, 6.43, 5.55, 2.5 }; int main(void) { FILE *fp; int i; if((fp = fopen("myfile", "wb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if(fwrite(d, sizeof d, 1, fp) != 1){ printf("書き込みエラー\n"); exit(1); } fclose(fp); if((fp = fopen("myfile", "rb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } for(i = 0; i < 10; i++) d[i] = -1.0; if(fread(d, sizeof d, 1, fp) != 1){ printf("読み込みエラー\n"); exit(1); } fclose(fp); for(i = 0; i < 10; i++) printf("%f\n", d[i]); return 0; } これを実行後、myfileをテキスト形式で開くと ffffff$@333333@、p= ラ」@ョG痙ョ・ヘフフフフフ@囮劔劔@H痙ョGV@ク・Qク@333333@ @ と文字化けして表示されてしまいます。 プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。 実行時にエラーが出るわけでもありません。 長くなりましたが、解決策がお分かりの方よろしくお願いします。

  • 構造体の変数をバイナリモードで書き込んだのですが

    C言語初心者です。 以下の様なプログラムで構造体の変数をバイナリモードで書き込んだのですが #include "stdafx.h" struct TBL { char c; int i; }; int _tmain(int argc, _TCHAR* argv[]) { FILE *fp; TBL sample; sample.c = 'A'; sample.i = 'A'; fp = fopen("sample.dat","wb"); fwrite(&sample,sizeof(TBL),1,fp); fclose (fp); return 0; } できた”sample.dat”をダンプしてみると 41 CC CC CC 41 00 00 00 EOF となり char型のデータも4バイトデータを所有しているのですがどうしてでしょうか。

  • バイナリデータ作成したいのですが、fwriteの使用方法を教えてください。

    indataというhexで書かれたテキストファイルをバイナリデータに変換したく 以下のようなプログラムを作成しましたが、dataのサイズを大きくすると coreダンプしてしまいます。具体的には7M超くらいから。 入力ファイルサイズはほぼ無限にあり、出力バイナリファイルは20MByteは欲しいです。 どのように改造したら、大きなサイズのバイナリファイルが作成できるでしょうか? 初心者ながら、いろいろ調べてここまで作成したので、根本がおかしいかもしれません。 よろしくお願いいたします。 #include<stdio.h> int main(void) { FILE *FPi, *FPo; char data[5000000]; int getdt,x; FPi=fopen("indata","r"); if ( FPi == NULL ) {return 1;} FPo = fopen("res.bin","wb"); if ( FPo == NULL ) {return 1;} x=0; while (1) { if(fscanf(FPi,"%x" , &getdt) == EOF ) {break; } data[x]=getdt; x++; } fwrite(data, sizeof(data), 1, FPo); fclose(FPo); fclose(FPi); return 0; }

  • fwrite の文法が間違っていますか?

    どうしてもエラーになってしまいます どこが間違っているかお教え頂けませんでしょうか 宜しくお願い致します $fp_i = fopen($indexphp, "w"); fwrite($fp_i, "<html>\n<head>\n"); fwrite($fp_i, "<title>title</title>\n"); fwrite($fp_i, "<meta http-equiv=\"content-type\" content=\"text/html; charset=Shift_JIS\">\n"); fwrite($fp_i, "</head>\n"); fwrite($fp_i, "<body>\n"); fwrite($fp_i, "<?php\n"); fwrite($fp_i, "$txt = 'test'\n"); fwrite($fp_i, "print'($txt)';\n"); fwrite($fp_i, "?>\n"); fwrite($fp_i, "</body>\n"); fwrite($fp_i, "</html>");

    • ベストアンサー
    • PHP
  • fwriteで書き込み

    やりたいことは・・・下に書いていきます。 何がおかしいのか教えてください。 $fp = fopen("example.txt", "r+"); fopenでexample.txtを読み書き可能で開きます。 返り値はポインタですよね。 $fseek = fseek($fp, -3, SEEK_END); $fpで開いたexample.txtのポインタを、ファイルの最後尾から3バイト戻したつもりです。 返り値は 0 成功 -1 失敗 $ftell = ftell($fp); で、今のポインタの位置を確認します。 返り値はポインタ。 fwrite($ftell,$write); $writeの内容を、example.txtの最後から3バイト戻ったところへ書き込み・・・のつもりなのですが。 専門分野ではありませんので、調べてもなかなか進まないです。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • fwrite文について

    char型で宣言した配列の方はうまくいきましたが、構造体を用いたfwrite文がうまく出力されません。 どうしてでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> struct ll{ char name[20]; int ten[3]; }list[3] = { {"aaa", 11}, {"bbb",22}, {"ccc",33} }; FILE *fpbin, *fpcsv; /*FILE構造体(グローバル変数)*/ void main(void) { char i[] = {'a','b'}; fpbin = fopen("data.txt","w"); //fwrite(&i,sizeof(char),2,fpbin); fwrite(&list[0].name,sizeof(struct ll),2,fpbin); fclose(fpbin); }

  • C言語のfor文について

    C言語のfor文について C言語初心者です。質問させていただきます。 output.datというバイナリファイルに値を書き込みたい(100~149)のですが、どうもうまくいきません。 値が半分だけ正常に入って、あとの半分はおかしな値が入ります。 どなたか分かる方教えていただけないでしょうか。 ソース(一部分)↓ int main(){ int i,j; char output[456]; //ファイルに値を入れる for(i=0,j=100;i<456,j<556;i++,j++){ output[i]=j; } //バイナリ書き込みモードでファイルをオープン if((fp = fopen("output.dat","wb")) == NULL) { printf("<output.dat> file open error\n"); exit(1); } //値をファイルに書き込む fwrite(output,456,1,fp); fclose(fp); exit(0); }

  • Cでバイナリデータを変換

    今持っているバイナリファイルfile1.x86をテキストファイルfile1.txtに変換したいんですけどうまくいきません。fopenとfreadでバイナリファイルを読み込むところまで入っていると思うんですけど、テキストファイルとして書き出すことができません。 #include <stdio.h> main() { short a[32000]; FILE *infile, *outfile; infile = fopen("iroha.x86", "r"); outfile = fopen("iroha.dat", "w+"); fread( a, sizeof(short), 32000, infile ); fwrite( a, sizeof(short), 32000, outfile ); fclose(infile); fclose(outfile); } これだとそのまんま出力されるんです。当たり前なんですけど... どこをどう変えればいいか教えてください。 よろしくお願いします。

  • freadとfwrite

     C言語初心者です。 fopenでテキストファイルで読み込んで,freadやfwriteなどは使っていいのでしょうか? 入門書などでは、freadやwriteはバイナリファイルでしか使っていないので疑問になりました。

専門家に質問してみよう