2013-09-05 16 views
5

私は768バイトを含むバイナリファイルa.binを持っています。いくつかのバイトを読み込み、Nバイトを飛び越し、数バイトを再度読み込みます。どうやって?

そして私は、私は

ifstream a1; 
a1.open("a.bin", ios::in|ios::binary) 

char tmp[256] 
a1.read(tmp,256) 

のようなsomethinをした。そして、私はいくつかのループをしたとするTMPコピー

char data[720] 

にバイト16から256まで、272から512まで、528から768を入れたいですデータ[720]は論理である。しかし、それは本当に馬鹿に見えます。だから、私はchar型のARRYの特定の位置にデータを読み取ることができますどのように

  1. をお聞きしたいですか?

    a1.read(tmp [2]、2)//これはどのように達成できますか?

  2. どのようにして特定の日にジャンプできますか?

    a1.read(tmp16,16);私はこれを使って16バイトを飛び越え、tmp16を使うことができますが、それは醜いです。

+0

[seekg(http://en.cppreference.com/w/cpp/io/basic_istream/seekg)を見て –

答えて

3

私はignoreが行く方法だと思います。

あなたは行き​​ます。

a1.ignore(16);     // [1] 
a1.read(data, 256-16);   // [2] 
a1.ignore(272-256);    // [3] 
a1.read(&data[256-16], 512-272); // [4] 
// and so on 
  1. [0]
  2. は、次のスキップ&データと本質的に同じ、それはバッファのBYT第一のアドレスです原因あなたは、ここにdataで行くことができる第一16バイト
  3. を無視します不要なバイト
  4. これは、読み込むバッファとしてdata[256-16+1]のアドレスを受け取ります。平文data[17]はそこから値を取るだけで、&演算子はそのアドレスを取る。私は256-16を前の呼び出しで読み込まれたバイト数に置き、次の空き領域で読み込みを開始したいのです。 0からの番号付けはこれです。
0

あなたはそれをアドレス

a1.read(tmp+2, 2) 

それとも、最初の質問について

a1.read(&tmp[2], 2) // the & operator is the address of operator 
5

を行うことができます与える必要があり、アレイ内の特定のポイントに読むには:

a1.read(&tmp[2], 2); 

は、2バイトをに読み込みますおよびtmp[3]

a1.ignore(10); 
10のバイトをスキップし

:2番目の質問については