• 締切済み

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を調べてみたのですが、よくわからないんです。 また、参考になるようなサイトがあればおしえてほしいです。

みんなの回答

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> う~ん、よくわかりません。 よくわからないのは、こちらのほうです。 Objective-Cのコードの中に、Cのコードは、そのまま書けるということは、ごぞんじですよね? 例示のコードも、そのまま書けますから、わざわざ「objective-cらしく書く」必要はないし、そのようなクラスもありません。 整数や構造体などを、NSDataに格納して、ファイルに書き出すにはどうすればいいか?という質問とも読めますが、どうなんでしょうか?No.1の回答に対して、「う~ん、よくわかりません。」では、どうもそうではなさそうなので、質問の真意をおたずねするしかありません。

object-saru
質問者

補足

cがそのまま使えるのは知ってますよ。 >NSDataに格納して、ファイルに書き出すにはどうすればいいか? そうではありません。 すでにWinのC#やC++で書いてあるデータがあり、 それを読み込む、データのビューアーの作成が意図です。 そのため、Cでの書き方は、しっていますが、 OBJECTIVE-Cらしい書き方をした場合には、どうなるのか? という事をお尋ねしています。 回答を見る限り、結局は、OBJECTIVE-Cらしい書き方はできないという事ですね。

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1
object-saru
質問者

補足

う~ん、よくわかりません。 objectvie-cの場合は、key付でないデータの場合は、 結局、NSCoder:encodeBytes:length:などを使って、 変換していくしかないのでしょうか。 そういった、サンプルソースは、どこかになんでしょうか~?

関連するQ&A

  • 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から直接バイナリが読めれば便利かと思い質問させていただきました。

  • プログラム(C)

    #include <stdio.h> #include <stdlib.h> #define FNAME "smp.bmp" #define WSIZE 256 #define HSIZE 256 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { ・   ・ }; struct BMPINFOHEADER { ・   ・ }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("ファイルをオープンできません\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose; return 0; } このプログラムはBMP画像を読み込むプログラムなんですが このプログラムに画素値を出力するプログラムにしたいのですがうまくできません。 結果は(真っ白な画像の時)255255255・・・255255と出力したいのです。白黒画像なのでR=G=Bで1画素値は255だけでいいのですが。どうしても255255255や25500などとでてしまいます。 アドバイスお願いします。(800字までなので構造体の宣言は抜いてしましました) 。

  • C言語 バイナリデータのサイズの調べ方

    windows7 64bitでcygwinを使用しています。 32bitを1つの組として、いくつかの組で構成されたバイナリデータがあります。 このバイナリデータにいくつの組があるのか調べるため、以下のようなソースを記述したのですが、うまくいきません。 どこを修正すればよろしいでしょうか。 御教授願います。 int main() { long long int i; long long int hex[1]; long long int aaaa; int bb; int ret; FILE * fp; i = 1; bb = 1; for(;;){ fp = fopen("kimi.dat", "r"); bb = fread(&hex[1],4,i,fp); aaaa = i; i = aaaa + 1; ret = fclose(fp); if (bb != aaaa) { printf("%lld\n",aaaa); printf("%lld\n",i); printf("%d\n",bb); exit(1); } } } gcc -std=c99でコンパイルしました。 結果は 1431440333 1431440334 1 のように表示されました。 データファイルは900MB以上あります。

  • バイナリファイルでランダムアクセスを行う

    初心者です。宜しくお願いします。 下記 text.bin にランダムアクセスするサンプルコードで一部理解できない箇所があります。 下から5行目のfreadの一つ目の引数 &num です。なぜ5のポインタなのか初心者にわかりやすく解説頂けないでしょうか? 宜しくお願い致します。 ■text.bin 80 60 22 50 75 ■サンプルコード #include <stdio.h> #define NUM 5 int main(void) { FILE *fp; int num; int i; fp = fopen("/Users/Documents/test1.bin", "rb"); if (fp == NULL) { printf("ファイルをオープンできませんでした。\n"); return 1; } printf("何番目のデータを読み込みますか?(1~5)\n"); scanf("%d", &i); fseek(fp, (i-1)*sizeof(int), SEEK_SET); fread(&num, sizeof(int), 1, fp); printf("%d番目のデータは%dです。\n", i, num); printf("<#message#>"); fclose(fp); return 0; }

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

    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バイトデータを所有しているのですがどうしてでしょうか。

  • 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); } これだとそのまんま出力されるんです。当たり前なんですけど... どこをどう変えればいいか教えてください。 よろしくお願いします。

  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

  • 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; } どこをどう記述し直したら上手く動作するのでしょうか。 これを応用して、バイナリファイルの入出力を使ってゲームのセーブデータのようなものを実現しようと考えています。 そちらの方では多くの量のデータがあるので、できるだけクラスごとバイナリファイル等に保存するようにしたいのですが、もし上記の方法が無理な場合他にどのような方法があるか教えていただきたいです。

  • バイナリ形式の読み込み

    void __fastcall TForm1::LoadData() { FILE *fp; int XYData[36000],I; AnsiString A; fp = fopen( "C:\\test1\\¥A.rdt", "rb" ); if( fp == NULL ){ ShowMessage("file open error\n" ); exit( 1 ); fread(XYData,2,70000,fp);         for(I=0;I<3600; I++){ A=XYData[I]; Memo1->Lines->LoadFromFile(A); } fclose(fp); } } これでメモに表示させたかったのですがうまく表示されてません。 読み込めていないのか、使い方が間違ってるのかわからないので指導よろしくお願いします。

  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

専門家に質問してみよう