【问题标题】:Searching for a combination of characters in a file在文件中搜索字符组合
【发布时间】:2015-04-22 23:28:32
【问题描述】:

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

所以我想找到所有以 /start/ 开头并以 /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
}

假设每个 /start/ 后跟一个 /end/。

问题是:

这种字符组合被切成两半的情况如何处理?

例如,假设第一次调用 read(),在这个缓冲区的末尾我发现 /star,而下一次 read() 在第二个开始时被调用缓冲区有 t/ 4jy42jygsfsf /end/

这种组合可能会在任何地方被削减。我认为的解决方案会产生很多行代码。有什么聪明的方法来处理所有这些情况吗?

【问题讨论】:

    标签: c file-io


    【解决方案1】:

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

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

    您在匹配器中的状态通常是:

    1. 目前没有匹配任何内容
    2. 刚刚看到/ - 接下来寻找“s”或“e”。
    3. 匹配start/end/
    4. 匹配 - /start/end

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

    您可以使用PCRE library。它支持部分匹配。但对于您的目的来说可能是矫枉过正。

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多