2015-04-22 22 views
1

我正在尝试创建一个读取文件并搜索特定字符组合的程序。 例如:“/ start/4jy42jygsfsf/end /”。在文件中搜索字符的组合

所以我想找到所有以/开始/结尾为/结尾/开头的“字符串”。

为了做到这一点,我使用read()函数,因为该文件可能是一个二进制文件(它不一定是带有字符的文件)。

我调用read()函数这样的:

#define BUFFSIZE 4000 

// more declarations 

while (read(file_descriptor, buffer, BUFFSIZE) > 0) 
{ 
    //search for /start/ 
    //then search for /end/ 
    //build a string with all the chars between these two 
    //keep searching till you reach the end of buffer 
} 

假设每/启动/后跟一个/结束/。

的问题是:

如何处理案件的字符的组合在半切?

例如,假设在第一时间阅读()被调用,在这个缓冲结束时,我发现/明星和阅读下一时间()被调用在第二个缓冲的开始有t/4jy42jygsfsf/end/

这种组合可能会在任何地方被切断。我认为的解决方案将导致许多许多代码行。有没有什么聪明的方法来处理所有这些情况?

回答

0

当您到达缓冲区末尾时,记录当前部分匹配的状态(如果有)。然后当你得到下一个缓冲区时,你有4种一般情况:

  • 不在任何要匹配的文本里面。
  • 只看到一个开始/在最后一个缓冲区末尾
  • 目前在/start/里面。另一个变量记录您匹配的距离。
  • 目前里面有/end/。与/start相同的变量记录您匹配的距离。

你的匹配器内的状态大致有:

  1. 目前不匹配任何
  2. 刚看到一个/ - 未来寻找一个 's' 或 'E'。
  3. 匹配start/end/
  4. 匹配 - /start/end

基于部分匹配,在匹配器中跳转到正确的状态。

OR

可以使用PCRE library。它支持部分匹配。但可能是为了你的目的矫枉过正。