读取几个字节,跳过N个字节,然后再读取几个字节.怎么样?

thu*_*ium 6 c++

我有一个二进制文件,a.bin,其中包含768个字节.

我想把字节16-256,272-512,528-768放进去

char data[720]
Run Code Online (Sandbox Code Playgroud)

我做了一些喜欢的事情

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

char tmp[256]
a1.read(tmp,256)
Run Code Online (Sandbox Code Playgroud)

然后我做了一些循环并将tmp复制到逻辑中的数据[720].但这看起来真的很愚蠢.所以我想问一下

  1. 如何将数据读取到特定的某个位置?

    a1.read(tmp [2],2)//不允许,如何实现?

  2. 我怎么能跳过某一天?

    a1.read(tmp16,16); 我可以使用它来跳16个字节并且neve使用tmp16,但它看起来很难看.

Jok*_*_vD 6

对于第一个问题:

a1.read(&tmp[2], 2);
Run Code Online (Sandbox Code Playgroud)

将两个字节读入tmp[2]tmp[3].

对于第二个问题:

a1.ignore(10);
Run Code Online (Sandbox Code Playgroud)

跳过10个字节.


luk*_*k32 5

我相信忽视是要走的路。

你走。

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
Run Code Online (Sandbox Code Playgroud)
  1. 忽略第一个16个字节
  2. 您可以在data此处使用,因为它是缓冲区的第一个字节的地址,本质上与&data [0]相同
  3. 跳过下一个不需要的字节
  4. 这将采用传递的地址data[256-16+1]作为要读取的缓冲区。Plain data[17]将从那里取一个值,而&operator取其地址。我输入的256-16原因是上一次调用中读取的字节数,我们想在下一个可用空间开始读取。从0这里开始编号。