【发布时间】:2014-05-01 20:05:53
【问题描述】:
我有一个要读取的二进制数据文件。文件中的值是 8 位无符号整数,“记录”分隔符是 ASCII 文本(例如$MSG、$GRP)。我把数据读成一大块,如下:
unsigned char *inBuff = (unsigned char*)malloc(file_size*sizeof(unsigned char));
result = fread(inBuff, sizeof(unsigned char), file_size, pFile);
我需要搜索这个数组以找到以$GRP 开头的记录(这样我就可以读取后面的数据),有人可以提出一个好的方法吗?我尝试了几件事,但都没有奏效。例如,我最近的尝试是:
std::stringstream str1;
str1 << inBuff;
std::string strTxt = str1.str();
但是,当我检查它的长度时,它只有 5。我在记事本中查看了文件,注意到第六个字符是 NULL。所以它似乎因为NULL而被切断了。有什么想法吗?
【问题讨论】:
-
不要混合使用 C 和 C++。使用
fstream并将您的文件直接读入std::string。如果你仍然想要/需要坚持使用你的 C 代码,don't cast the result of malloc。 -
不要混合使用 C 和 C++。去
for (i=0; i<file_size-4; i++) if (strncmp(&inBuff[i], "$MSG", 4) printf( "Found $MSG at %d\n", i ); -
能否提供一些示例代码和示例文件?听起来很容易通过
strstr()和sscanf()实现。 -
@Dogbert 鉴于该文件包含 8 位无符号整数,其中一些为 0(又名 NULL),我很确定
strstr不是一个可行的解决方案,我怀疑 @ 987654333@ 也可以。从问题描述来看,OP是二进制文件,而不是简单的文本文件。 -
@user3386109 它实际上是一个二进制文件,包含二进制和 ASCII 值(实际上是混合的)。不过划界并不难,如果我们把 is 当作 ASCII,我们可以找到边界。