逐步读取二进制文件

时间:2016-06-10 22:38:51

标签: c++ binaryfiles

我最近提出了另一个关于解析二进制文件的问题,我感谢大家在这里工作。

https://stackoverflow.com/questions/37755225/need-help-reading-binary-file-to-a-structure?noredirect=1#comment62983158_37755225

但我现在面临新的挑战,我需要帮助。

我的二进制文件看起来像这样但更长......

ST .........¸。°Ý.ø...0.œ........... ESZ4 1975 .......... IYH。 testDBDBDBDBST ...........°Ý.ø................... DBDBDBDBST .........P.'Ý。 ø...0.œ........... ESZ4 1975 .......... HTC.testDBDBDBDBST ......... <,'Ý... ................. DBDBDBDBST .........ƒD.Þ.ø...0.œ........... ESZ4 1975 .......... ARM.testDBDBDBDBST .........«E.Þ.ø................... DBDBDBDB < / p>

基本上,每条消息都以'ST'开头,以'DBDBDBDB'结尾。目标是解析每条消息并将消息存储到数据结构中。此外,每条消息都根据类型而有所不同,不同类型的消息将有其他成员。

我遇到的问题是,我不知道如何遍历这个二进制文件...如果它是一个常规文件,我可以做(getline(file,s)),但二进制文件怎么样? ?有没有办法说,找到第一个“ST”和“DBDBDBDB”并解析中间的东西,然后转到下一组ST和DB?或者以某种方式逐步读取文件,跟踪我的位置?

我提前为发布这么多代码而道歉。

/* Prevent block display and transition animation */
.expand-icon.collapse.in,
.collapse-icon.collapse.in {
  display: inline; }
.expand-icon.collapsing {
  display: none; }

/* HTML Toggler with glyphicons */
<a data-toggle="collapse" href=".my-collapse">
 <span class="my-collapse collapse-icon collapse in">
  <span class="glyphicon glyphicon-collapse-up"></span>
 </span>
 <span class="my-collapse expand-icon collapse">
  <span class="glyphicon glyphicon-expand"></span>   
 </span>
</a>

非常感谢.....

1 个答案:

答案 0 :(得分:0)

您可以将整个文件读取到缓冲区,然后根据您的要求解析缓冲区。

我会用

fread 

将整个文件读取到缓冲区,然后逐字节处理/解析缓冲区。

这是一个例子:

/* fread - read an entire file to a buffer */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) 
     {fputs ("File error",stderr); exit (-1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) // malloc failed
     {fputs ("Memory error",stderr); exit (-2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize)
     {fputs ("Reading error",stderr); exit (-3);}

  // the whole file is now loaded in the memory buffer. 
  // you can process the whole buffer now: 

  // for (int i=0; i<lSize;i++)
  // {
  //    processBufferByteByByte(buffer[i]);
  // }
  // or
  // processBuffer(buffer,lSize);

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}