• ベストアンサー

2次元配列への格納方法について

こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

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

  • ベストアンサー
  • herbest
  • ベストアンサー率42% (15/35)
回答No.5

UDP…でしょうか?あまり詳しくないのでよくわかりませんが(再送は手動でやるんでしたっけ) とにかくやりたい事は理解しました。 /***************************/ struct tempBuf{ int Number; char Data[1024]; } ....中略..... struct tempBuf test[100]; test[0].Number = 0; strcpy(test[0].Data, "hellow world"); send(listen, &test[0], sizeof(test[0]), 0 ); /***************************/ ↑これでテストしてみましたが上手い事出来たので 構造体でOKですね。(ソケット通信ですよね?) 仮に配列に直接通し番号を入れるなら受信側で 数値とデータを分けるルーチンが必要になります。 逆に言えばそれさえ作れば16進数でもasciiコードでも 適当に入れりゃいいんですけどね。

bird0214
質問者

お礼

返信ありがとうございます UDPソケットを利用しています。再送機構がないので、アプリケーションで実装を試みています。 大変分かりやすい説明ありがとうございました。

その他の回答 (4)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.4

おっしゃるとおり、2次元配列を使えばよいのではないでしょうか。 Tもいりませんし。 ================================ FILE *fp; SIZE 1024; int n,i; char Buf[100][1024]; for( i = 0;i < 100; i++){ while((n = fread(Buf[i],sizeof(char),SIZE,fp)) != 0){ } } ================================ 1次元目の配列の数値(0~99)がTにあたるので、それを使えばよいのでは?

bird0214
質問者

お礼

返信ありがとうございます。 構造体で行うのか、2次元配列を用いるのか二つの方法を知ることができました。 ありがとうございました。

  • herbest
  • ベストアンサー率42% (15/35)
回答No.3

構造体は分けて扱うという意味合いだったのですが どうしても配列に格納したいと言う事ですね。 それでしたら普通に数字入れた後に読み込んだデータを追加したら 良いと思うのですが。 どういった所が解らないのでしょうか? 数字を配列に入れる ↓ 読み込んだデータを配列に追加する。 ↓ 次の配列へ この繰り返しでいけます。 あと念のためアウトプットの方法を示して下さい。 あ、もしかしてもしかするとデータを全部テキストで扱いたいって事ですか?

bird0214
質問者

補足

返信ありがとうございます。 申し訳ありません。私が行いたいことは・・・ 1.送信端末と受信端末を用意し、送信端末で100パケット(1パケット1024Byte)を受信端末へ送信します。その際、各パケットに通番を付加しておきます。 2.受信端末は送信端末からのパケットを受信し、通番を確認します。通番を確認した際に、未受信の通番を送信端末へ送信します。 3.送信端末は、受信端末から送信されてきた、通番(受信端末で取得することができなかったパケットの通番)を見て再度、その通番のパケットを送信します。 このように、動作1の時に、通番+fread関数で読み取った1024Byteのバイナリデータをメモリに格納しておきたいと思っています。←これが質問内容です。 herbestさんと#2の方がご提示してくださった、構造体と配列でしょうか?を利用した方法をとりたいと思います。 >あ、もしかしてもしかするとデータを全部テキストで扱いたいって事ですか? 通番はテキストデータ パケット部はバイナリデータ としたいと思っています。通番もバイナリデータとして扱ってよいのか分からないためです・・・ 通番は、1,2,3・・・という数値型です。 よろしくお願いします。

noname#22058
noname#22058
回答No.2

構造体の配列を用意すればよいです。 ・配列の要素数は100 ・構造体のメンバーは「1~100の連番用のエリア」と「バイナリーデータ用のエリア」

bird0214
質問者

お礼

返信ありがとうございます。 構造体は、とても便利ですね・・・本日、そう思いました。 ポインタが、まだまだうまく理解できていませんが、今後とも勉強していくつもりです。 ありがとうございました。

  • herbest
  • ベストアンサー率42% (15/35)
回答No.1

二次元配列でいけますが配列は1027バイトいりますよ。(100で3バイト) ただ、アウトプットをどうしたいのかによりますが 恐らく構造体を使って数値とデータを分けたほうが想像してる使い方が出来ると思います。

bird0214
質問者

補足

返信ありがとうございます。 >恐らく構造体を使って数値とデータを分けたほうが想像してる使い方 >が出来ると思います。 struct tempBuf{ int 数値; char Buf[1027]; }A_Buffer; というような記述でしょうか? 1BBBBBBBB・・・・・B 2BBBBBBBB・・・・・B ・ ・ ・ 100BBBBBBB・・・・・B B:バイナリデータ というように、配列内に格納したいと思っています。 上記の記述のような構造体であれば、上書きされてしまう恐れがあると思っているのですが・・・・ どのような記述方法があるか、わかりましたら教えて頂きたいと思っています。 よろしくお願いします。

関連するQ&A