• 締切済み

C言語で、テキストファイルに下記の構造体データのバッファを保存し、

C言語で、テキストファイルに下記の構造体データのバッファを保存し、 PHPで構造体データの中身を取ることは可能でしょうか。 struct ParamData{ signed short paramA; signed short paramB; signed short paramC; signed short paramD; signed short paramE; signed short paramF; signed short paramG; }; C言語では、 ParamData* params = (ParamData*)readData; で取得できたのですが・・・。 宜しくお願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

freadで読みます。整数値の配列にするなら、unpack関数を使います。 Cのshortが2バイトだとして、 $handle = fopen($filename, "r"); $data = fread($handle, 14); if(strlen($data)!=14){  エラーの時の処理 } $data_array = unpack("s*",$data); ・・・・・・ fclose($handle);

g2_destiny
質問者

お礼

ご解答ありがとうございます。 上記の通りやってみたのですが、あまりうまく動いてくれません 具体的に何がしたいかを申しますと、 C++で組んだゲームにランキング情報を載せたく、 カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n ・・・・ ・・・・ ・・・・ というデータを出力するaspファイルがあり(\t はタブ)、 そのデータをPHPで個別に取得し、出力できるよう抽出したいということです。 現状試しているPHPのコードですが、 <?php // 文字配列 $moji = array( "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" ); // aspファイルからデータを抽出 $openfile = file_get_contents( "aspファイルのパス"); $csv_gyo = split("\n", $openfile ); foreach( $csv_gyo as $kurikaeshi ) { $data = split( "\t", $kurikaeshi ); print "カテゴリID = ".$data[ 0 ]."<br>"; print "スコア = ".$data[ 1 ]."<br>"; print "ユーザー名 = "; // デコード $userdata = base64_decode( $data[ 2 ] ); // short型で配列化 $data_array = unpack("s*",$userdata ); $arrayMax = count( $data_array ); for( $i = 0 ; $i < $arrayMax ; $i++ ){ print $moji[ $data_array[ $i ] ]; } print "<br>"; } ?> このような感じです。 何かアドバイスなどありますでしょうか。 尚、C++のソース、aspファイルの中身は変えられませんので、 PHPのみの変更でお願いいたします。

関連するQ&A

  • C言語の構造体のサイズについて

    いつもお世話になっていります。 早速ですが、C言語の構造体のサイズについて教えてください。 typedef struct B { short code; char name; float price; } B; typedef struct A { B bbb[10]; double sougaku; } A; A aaa; といった構造体があった場合に、 sizeof(aaa.bbb.code) + sizeof(aaa.bbb.name) + … + sizeof(aaa.sougaku) という風に一つ一つサイズを取得し、合計して構造体のサイズを取得した場合と sizeof(aaa) という風に構造体のサイズを取得した場合のサイズの値が異なるといった現象が起きます。 その原因が分からなくて困っております。 そこで考えられる要因をお教えください。 因みに実際の構造体はサイズで言えば2500バイトくらいあります。 froat/char/double/short 型を使用しております。 よろしくお願いします。

  • テキストデータと構造体。

    テキストデータを構造体に代入し、キャッシュの仕組みの様に見せるプログラムをC言語で作れますか? 教えて下さい。ちょっと緊急です…

  • C言語構造体についてです。

    C言語、π=PI 3.14159265で構造体を用いてmensekiを呼び出して 半径と面積を計算して出力するプログラムです。下の空白を埋めてもらえますか? /* 構造体のプログラム */ #include <stdio.h> #include <math.h> #define PI 3.14159265 struct Data { /* 半径rと面積areaをdoubleで宣言 */ }; void menseki(struct ... 構造体のポインタを引数とする ){ /* 面積を計算する際に構造体のアドレスから計算する */ circle->area=PI* .....; } main(){ struct Data example[2]; //構造体配列 int i; /* 半径rを構造体配列を用いて2例入力する */ /* 2例の各々について mensekiを呼び出して 半径と面積を計算して出力する */ } よろしくお願いします。

  • C言語の構造体

    組込み系でマイコンにソフトをプログラミングの仕事をしています。 C言語は初心者です。 http://www9.plala.or.jp/sgwr-t/c/sec15.html のページの冒頭に、 「構造体は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。」と書かれています。 1つのデータ型として扱うとどのようなメリットがあるのでしょうか? 例えば、 struct seiseki seito1; のように対象が1つ(seito1)なら int seito1_no; char  seito1_name[20]; double seito1_average; と変数を確保すれば済むのに、 何故、構造体で宣言するのでしょうか? 例えば、 struct seiseki seito2[20]; のように、似たものが複数ある場合は(seito2が20人分なるなら、) 構造体で宣言する意味があるとはなんとなくわかります。 後ページの http://www9.plala.or.jp/sgwr-t/c/sec15-4.html では、関数でのやり取りが書かれています。 関数で引数や返値で扱うときに構造体にしておいた方が良いからでしょうか? 構造体のメリットというのが今一わかりません。 対象が1つでも構造体で書いた方がいろんな意味で良いのでしょうか? 如何せん、初心者なので質問がうまく書けませんがご了承ください。 ※上から目線的な回答はご遠慮願います。

  • テキストデータ 構造体 入出力

    テキスト(何が入っているか分からない)データの内容を構造体に格納して、格納された構造体の内容を画面に表示するのは可能でしょうか? C言語でソフトはVCです。 宜しくお願いします。

  • C言語において、以下の条件で、ファイルに保存されているテキストデータを

    C言語において、以下の条件で、ファイルに保存されているテキストデータを構造体に格納する方法を教えて下さい。 例題として、テキストファイルに保存されている社員データを構造体に格納するものとします。 初心者なので、記述内容が充分か分かりませんが、宜しくお願いします。 ---以下条件--- ・入力ファイルはテキスト形式(.txt)とし、ファイル名は「memberlist」とします。 ・ファイル(memberlist)には、社員1人につき、社員番号、名前、名前(ヨミガナ)が、「,」で区切られて存在するものとします。 また、、テキストファイルには一行につき社員1人のデータが存在するものとし、複数の社員データが同一行に存在することはありません。 テキストファイルの例). 10001,山田太郎,ヤマダタロウ, 10002,佐藤一郎,サトウイチロウ, 30010,池田悟,イケダサトル, ……………… ………………(続く) ・構造体は以下のように定義されているものとします。 なお、テキストファイルに何件の社員データがあるかは定義しませんが、 構造体の数は充分に確保されているものとします。 struct Person { int num;      /*社員番号*/ char name[10]; /*名前*/ char kana[20];  /*名前(ヨミガナ)*/ }; struct Person List[100]; 上記の条件のもとでテキストファイルの内容を構造体に格納したいのです。 そこで以下のようなプログラムを作ってみましたが、エラーが発生してしまいます(後述)。 #include<stdio.h> /***構造体定義***/ struct Person { int num;      /*社員番号*/ char name[10]; /*名前*/ char kana[20];  /*名前(ヨミガナ)*/ }; struct Person List[100]; main() /***変数の定義***/ FILE *rfp char rbuf[256]; char *tp; int i,size; /***ファイルオープン***/ rfp = fopen("memberlist.txt","r");   /*エラー処理省略(ファイルオープンは正常に終了したものとします)*/ /***構造体への格納処理***/ while(1){ size = fgets(rbuf,256,rfp);    /*テキストデータを一行取得*/   tp = strtok(rbuf,",");       /*テキストデータをカンマで区切る*/   sprintf(List[i].num,"%05d",tp); /*文字列を数値に変換し、社員番号を構造体へ*/   tp = strtok(NULL,",");      /*テキストデータをカンマで区切る*/   strcpy(List[i].name,tp);     /*名前を構造体へ*/   tp = strtok(NULL,",");      /*テキストデータをカンマで区切る*/   strcpy(List[i].kana,tp);      /*ヨミガナを構造体へ*/  if(size == NULL){   break;                 /*データを読み終えたら、ループを離脱*/  } } 上記のプログラムのエラー内容ですが、 まず、社員番号を文字列変換し格納するsprintf文で、 「パラメータ '__buffer' は signed char * 型として定義されているので int は渡せない(関数 main )」 というコンパイルエラーが発生します。 また、実行すると、Windowsからのエラー、「問題が発生したため、”プログラム名”を終了します。~~~」というプログラムが強制終了される時に出現するエラーが発生します。 可能性としてどのような問題が考えられますか?よろしくお願いします。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • データ構造のテキスト保存について(C言語)

    趣味でCの勉強をしています。 リスト構造や二分木構造のデータをテキストファイルに保存、読み込み再構成させたいです。 データ構造の要素(構造体)に別の要素を指すポインタが含まれてのですが、この情報をテキスト化する方法が有りますか? 考えたのは、各要素にID番号などユニークな記号をつけてポインタ値の代わりにそのIDをテキストに保存しておき、再構成の際にはそのIDとmallocで取得した要素のアドレスを関連つけるテーブルを作成して、テーブルの全ての要素のアドレスが決定したら、各要素内のポインタに対応するアドレスを設定するというものです。 これで問題はないと思うのですが、もっと適切な方法或いはライブラリなどありましたらご教示をお願いします。 またテキスト保存の一般的なフォーマットがありましたら併せて教えていただけると嬉しいです。 構造体の要素としては、ポインタの他に文字列(char配列)、int、doubleなどがありテキストファイルの状態で値が読み取り可能である方が良いです。 使用環境はWindows上のMingw gccです。 よろしくお願いします。

  • テキストデータから構造体にデータを保存する方法

    C言語初心者です。 大きなテキストデータ(730MB)からデータを取得して、構造体に保存し表示するというプログラムを作成しています。テキストのサイズが大きいため構造体のサイズを400000とし、 残りをftellとfseekを使用してファイルポインタをずらして全データを順次読み込んで表示しようとしているのですが、実行すると400000行目以降(最初の構造体のMAX時点)がうまく読み込めません。 詳しい方がいましたら、ご教授願います。 #define MAX_SIZE 400000 char filename[] = ″test.txt"; struct ALL_DATA{ char cmd[10]; int addr; int bsize; }; for (int lp = 0; lp < 100; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", ADATA[fc].cmd, &ADATA[fc].addr, &ADATA[fc].bsize); } } LP = ftell(fp); //現在のFPの取得 printf("********** FP-> %ld *********\n", LP); fclose(fp); while (i < MAX_SIZE){ if (loopcnt == 0){ printf("ADATA[i].cmd -> %s, ADATA[i].addr -> %d, ADATA[i].bsize -> %s\n",ADATA[i].cmd, ADATA[i].addr, ADATA[i].bsize); // i++; } } 上記のような形で作成しています(一部抜粋)。 読み込むテキストデータは testA 123456 20 testA 23415 2 testB 12114567 678 のように「文字列 スペース 数字 スペース 数字」と並んでおり 値はランダムになっています。 初めて質問するため、わかりにくい記述があるかと思いますが、よろしくお願いします。

  • 構造体のファイル出力

    以下のような構造体を、テキストファイルに保存するにはどうしたらよいでしょうか? 構造体には、4つのデータがある場合、以下のようにします。 [構造体] typedef struct comp_bango { char bango[3]; } COMP; 出力テキスト 100 200 300 400

専門家に質問してみよう