例如,我有一个bin文件,并且该文件中有许多消息,我知道msg开头的前两个字节是0x43和0x78,例如msg看起来像CxdjjdjdjdjdjdjdeiCxejejejejdjdclCxejdjdd如何阅读按序阅读序言我想这样读1. Cxdjjdjdjdjdjdjdei2. Cxejejejejdjdcl3. Cxejdjdd
文件不是小文件,而是大文件。我想按味精选择味精,然后逐字节读取,然后将字节解析为库函数,并检查此味精的结果,然后读取下一个,并重复每个味精的所有操作。我知道味精不大于1400字节
fread
)以利用标准库缓冲的优势C实现的基础:
const char preamble[] = {0x43, 0x78};
char buffer[2048];
size_t sz = fread(buffer, 1, sizeof(buffer), fd);
char *msg_start = NULL; // no start of message
char *search_start = buffer;
size_t search_size = sz;
for(;;) {
char *end = memchr(search_start, preamble[0], search_sz);
if (end == NULL) {
end = buffer + sz;
}
if ((end < buffer + sz - sizeof(preamble)) && memcmp(end, preamble, sizeof(preamble)) != 0) {
size_t delta = end - search_start + 1;
search_sz -= delta;
search_start += delta;
if (search_sz > sizeof(preamble)) continue;
end = buffer + sz;
}
if (msg_start != NULL) {
// process the message between msg_start and end
}
if (end == buffer + sz) break;
for (char *dest = buffer, char *src = end; src < end; src++, end++) *dest = *src;
size_t delta =fread(buffer + sz, 1, sizeof(buffer) + sz, fd);
if (delta == 0) break;
sz += delta
search_start = msg_start = buffer + sizeof(preamble);
}
注意:未经测试,可能包含错字或错误的代码...