12

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

我想将字节 16-256、272-512、528-768 放入

char data[720]

我做了类似的事情

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

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

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

  1. 如何将数据读取到字符数组的某个位置?

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

  2. 我怎样才能跳过某一天?

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

4

4 回答 4

7

对于第一个问题:

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

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

对于第二个问题:

a1.ignore(10);

跳过 10 个字节。

于 2013-09-05T15:16:01.143 回答
7

我相信忽略是要走的路。

你走。

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. 忽略第一个 16 字节
  2. 你可以在data这里,因为它是缓冲区的第一个字节的地址,基本上与 &data[0] 相同
  3. 跳过下一个不需要的字节
  4. 这将获取并传递地址data[256-16+1]作为要读入的缓冲区。Plaindata[17]会从那里取一个值,而&operator 取它的地址。我放在256-16那里的原因是上一次调用中读取的字节数,我们想在下一个空闲空间开始读取。编号由此而来0
于 2013-09-05T15:16:32.833 回答
1

要读取数组中的某个点,您需要为其提供地址

a1.read(tmp+2, 2)

或者你可以做

a1.read(&tmp[2], 2) // the & operator is the address of operator
于 2013-09-05T15:15:05.547 回答
1

要设置要在流中读取的位置,请使用seekg.

http://en.cppreference.com/w/cpp/io/basic_istream/seekg

于 2013-09-05T16:04:49.533 回答