• ベストアンサー

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

leaz024の回答

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

No.1の補足より 「32000個の符号つき16ビットバイナリデータを32000個の10進数データとしてテキストファイルに書き込む」ということですよね。 #include <stdio.h> typedef short _s16bit; int main(void) {   FILE *fi, *fo;   int  i;   _s16bit sh_buf[32000];   fi = fopen("file1.x86", "rb");   fread(sh_buf, sizeof(_s16bit), 32000, fi);   fclose(fi);   fo = fopen("file1.txt", "w");   for (i = 0; i < 32000; i++) {     fprintf(fo, "%-6d%c", sh_buf[i], (i%10==9) ? '\n' : ' ');   }   fclose(fo);   return 0; } ○_s16bitは、お手持ちの環境に合わせ、符号つき16bitの型にtypedefしてください。(まだたいていの環境では大丈夫だと思いますが) ○エラーチェックは、ご自分の責任において組み込んでください。 ○ブラウザ上での見易さを考慮し、全角スペースをふんだんに(笑)使ってあります。行頭は全角SP2個でタブ1つに、シングルクォート内は半角SPに変換してからご利用ください。 注)脳内C/C++のコンパイル確認しかしておりません(笑)

collacolla
質問者

お礼

回答ありがとうございます。 そのまま実行したところ少しエラーが出ましたけど どうにかなりました。

関連するQ&A

  • バイナリデータをテキストファイルに出力したい

    以下のソースファイル(test.c) が、 バイナリデータをテキストファイルに するものらしいのですが、 ファイル名(例えば bi.dat)を指定する方法が わかりません。 C++は勉強し始めたばかりで 詳しくありません。 よろしくお願い致します #include <stdio.h> int main( int argc, char *argv[]) { FILE *fpIn; FILE *fpOut; short snData; if( argc < 2) { printf("ファイル名を入れてください。"); return -1; } fpIn = fopen( "argv[1]" , "rb"); if( fpIn == NULL) { printf("入力ファイル %s を開けませんでした。", argv[1]); return -2; } fpOut = fopen( "output.txt", "w"); if( fpOut == NULL) { printf("出力ファイル output.txt を開けませんでした。"); fclose(fpIn); return -3; } while( fread( &snData, sizeof(short), 1, fpIn) == 1) { fprintf( fpOut, "%d\n", snData); }; fclose(fpIn); fclose(fpOut); return 0; }

  • Cで出力したバイナリをPythonから読みたい

    C言語でバイナリファイルに出力した配列データを、Pythonで使えるように読み込みたいです。 具体的な状況は以下の通りです。 ①以下のCプログラムを実行してdata.binを作った ``` #include <stdio.h> #include <complex.h> int main(){ int N = 256; double complex a[N]; FILE *fp; for(int i=0; i<N; i++){ /* a[N]に値を代入 */ } fp = fopen("data.bin", "rb"); fwrite(a, sizeof(a), 1, fp); fclose(fp); return 0; } ``` ②Pythonからこのdata.binファイルにアクセスして複素数の配列を得たい、が良い方法がわからない という感じになります。 現状やりかたがわからないので、一旦Cでバイナリファイルをfreadで読み込んでからfprintf等で10進数表記のテキストデータとしてファイル出力して、それをPythonから普通に文字として読み込んでから数値に変換して処理しています。 一回中間ファイルが挟まるので処理が面倒です。Pythonから直接バイナリが読めれば便利かと思い質問させていただきました。

  • fread処理がうまくいかない!!

    バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }

  • この方法でバイナリデータが読めるのでしょうか

    あるプログラムでバイナリ出力しているファイルがあります。これを単純にfread()で読み込んで、今度はfprintf()で出力すればどうなりますか?やりたいことは、バイナリ出力されたファイルをテキストファイルに変換したいのですが、この方法で、バイナリファイルが読めるでしょうか? ちなみに、読みたいバイナリファイルは、fwrite()で書き出したファイルです。 あと、「バイナリファイルです」と言って貰ったファイルを、windowsのテキストエディタなどで開くと、appleなどの通常のアルファベットの単語と、あとは訳のわからないものが見えるのですが、これってバイナリファイルじゃないですよね?appleなどと書いてあるのですから。 間違えていましたら、訂正お願いします。

  • バイナリデータ作成したいのですが、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; }

  • バイナリで書き込みましたがエラーが出る。原因は?

    拡張子を.wavとしてあるa.wavというファイルがあります。 fopenとfread関数を用いて以下のように読込み、 fp = fopen("a.wav","rb"); fread(data[0],4,1,fp); fopenとfwriteを用いてb.wavファイルに以下のように書き込みました。 fa= fopen("b.wav","wb"); fwrite(data[0],4,1,fa); 書き込んだb.wavファイルですが、 バイナリエディタStirlingでa.wavとb.wavファイルの中身を比較したら中身は同じでした。 しかし、a.wavファイルでは音が出力されるのに、b.wavファイルでは音が出力されずエラーが出ます。 この原因はいったいなんでしょうか? 原因がわかる方がいましたら教えていただけないでしょうか? よろしくお願いいたします。

  • freadとfwrite

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

  • C++におけるバイナリファイルの入出力について

    VisualStudioExpress2015のC++にて、次のような記述をし、二回目に実行したところアクセス違反が発生してしましました。 内容としてはセーブデータが見つからない場合はセーブデータにクラスの情報を書き込み、セーブデータがあった場合はセーブデータからクラスの情報を読み込むというものです。 #include <stdio.h> #include <stdlib.h> #include <string> #include <map> using namespace std; class MyClass { public: MyClass(); ~MyClass(); //private: int x, y; char *str; map<int,string> mMap; }; MyClass::MyClass() { } MyClass::~MyClass() { } void write() { MyClass *myclass = new MyClass; myclass->x = 10; myclass->y = 100; myclass->str = "aaaa"; myclass->mMap[10] = "bbbb"; FILE *fp1; if (fopen_s(&fp1,"セーブデータ.dat", "wb") != 0) {//エラーが起きたらNULLを返す return; } fwrite(&myclass, sizeof(myclass), 1, fp1); // SaveData_t構造体の中身を出力 fclose(fp1);//ファイルを閉じる } void read() { MyClass *myclass2 = new MyClass; FILE *fp2; if (fopen_s(&fp2,"セーブデータ.dat", "rb") != 0) { return; } fread(&myclass2, sizeof(myclass2), 1, fp2); fclose(fp2); printf("x=%d\ny=%d\nstr=%s\nmMap[10]=%s\n", myclass2->x, myclass2->y,myclass2->str,myclass2->mMap[10].c_str()); } int main() { FILE *fp; if (fopen_s(&fp, "セーブデータ.dat", "rb") != 0) { write(); } else { read(); } system("pause"); return 0; } どこをどう記述し直したら上手く動作するのでしょうか。 これを応用して、バイナリファイルの入出力を使ってゲームのセーブデータのようなものを実現しようと考えています。 そちらの方では多くの量のデータがあるので、できるだけクラスごとバイナリファイル等に保存するようにしたいのですが、もし上記の方法が無理な場合他にどのような方法があるか教えていただきたいです。

  • HTKのヘッダについて

    HTKというツールキッドを使用しています。 HTKでは任意のデータを使ってHMMの学習ができるのですが、そのときにデータファイルに12バイトのヘッダを付加する必要があります。 この処理をc言語のプログラムでやろうとしているのですが、うまくいきません。 ヘッダは、long型long型short int型short int型という4つの情報で構成されていて、そのあとにfloat型のデータが続いています。 使用しているプログラムの一部は以下のようになっています。 out = fopen("outfile", "wb"); fwrite(&head1,sizeof(long),1,out); fwrite(&head2,sizeof(long),1,out); fwrite(&head3,sizeof(short),1,out); fwrite(&head4,sizeof(short),1,out); fwrite(data, sizeof(float), num, out); //data[]がデータ fclose(out); このプログラムで書き出したファイルでHTKのHInitを実行すると「ヘッダが読み込めない」というエラーがでてしまいます。 任意のデータをHTKフォーマットにするにはどうすればいいのでしょうか?教えてください。よろしくお願いします。

  • objective-cで、バイナリの読み込みに関して。

    objective-cで、バイナリの読み込みに関して。 バイナリファイルが容易してあり。 例えば Cで下のようなソースで読み込みできるとします。 typedef struct tagTTestStruct { int data1; int data2; char data3; } TTestStruct; int main() { TTestStruct testdata; FILE *fp; fp = fopen( FILENAME , "rb" ); fread( &testdata , sizeof( testdata ) , 1 , fp ); fclose( fp ); printf( "data1 = %d , data2 = %d , data3 = %d\n" ,testdata.data1,testdata.data2,testdata.data3 ); return 0; } これを、objective-cらしく書くにはどうしたらいいのでしょうか、、、 nsdataやnsarchiverを調べてみたのですが、よくわからないんです。 また、参考になるようなサイトがあればおしえてほしいです。