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

时间:2013-09-05 15:11:32

标签: c++

我有一个二进制文件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复制到逻辑中的数据[720]。但这看起来真的很愚蠢。所以我想问一下

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

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

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

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

4 个答案:

答案 0 :(得分:6)

对于第一个问题:

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

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

关于第二个问题:

a1.ignore(10);

跳过10个字节。

答案 1 :(得分:4)

我相信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. 忽略前16个字节
  2. 你可以在这里使用data,因为它是缓冲区的第1个字节的地址,与& data [0]
  3. 基本相同
  4. 跳过下一个不需要的字节
  5. 这将采用并传递data[256-16+1]的地址作为要读入的缓冲区。普通data[17]只会从那里获取值,而&运算符会获取其地址。我把256-16放在那里因为这是在前一个调用中读取的字节数,我们想要在下一个可用空间开始读取。从0编号就是这个。

答案 2 :(得分:1)

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

a1.read(tmp+2, 2)

或者你可以做到

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

答案 3 :(得分:0)

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

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