2013-09-05 68 views
5

我有一个二进制文件,a.bin,其中包含768个字节。读取几个字节,跳过N个字节,然后再读取几个字节。怎么样?

我希望把字节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个字节,并且使用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. 忽略第一个16个字节
  2. 你可以data去这里,因为它是第一的地址BYT缓冲区,基本上是一样的&数据[0]
  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); 

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

对于第二个问题:

a1.ignore(10); 

跳过10个字节。

相关问题