【问题标题】:Read several bytes, jump over N bytes, and then read several bytes again. how?读取几个字节,跳过 N 个字节,然后再次读取几个字节。如何?
【发布时间】:2016-07-12 05:59:31
【问题描述】:

我有一个二进制文件 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,但它看起来很难看。

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    第一个问题:

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

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

    第二个问题:

    a1.ignore(10);
    

    跳过 10 个字节。

    【讨论】:

      【解决方案3】:

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

      a1.read(tmp+2, 2)
      

      或者你可以这样做

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-03-02
          • 1970-01-01
          • 2020-06-12
          • 2015-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-01
          • 1970-01-01
          相关资源
          最近更新 更多