解析控制字符串的数据流

时间:2010-10-14 17:28:15

标签: c parsing

我觉得这是一个非常常见的问题,但我不确定要搜索什么。

我有一个大文件(因此我不想将其全部加载到内存中)我需要解析控制字符串,然后将该数据流式传输到另一台计算机。我目前正在以1000字节块的形式读取文件。

例如,如果我有一个字符串,其中包含转义为('$'一些数字';')的ASCII代码,数据看起来像这样......“快速$ 33;棕色$ 126; fox $ a $ 12a ”。进入另一台计算机的字符串将是“快速棕色!~fox $ a $ 12a”。

在我目前的方法中,我遇到以下问题:

  • 控制字符串落在缓冲区边界时会发生什么?
  • 如果字符串是'$',后跟除了数字和';'之外的任何内容我想忽略它。所以我需要提前读取,直到找到完整的控制字符串。

我是用直接的C写的,所以我没有流来帮助我。

交替双缓冲方法是否有效,如果是,那么如何管理当前位置等。

2 个答案:

答案 0 :(得分:2)

如果我按照您的要求进行操作,则称为词法分析或标记化或正则表达式。对于常规语言,您可以构建一个可识别输入的有限状态机。在实践中,您可以使用理解正则表达式的工具来识别和执行输入的不同操作。

根据不同的要求,您可能会有不同的看法。对于更复杂的语言,您可能希望使用lex之类的工具来帮助您生成输入处理器,但为此,据我所知,在修复缓冲区问题后,您可以使用更简单的方法。

您应该使用循环缓冲区作为输入,以便从末尾开始索引再次包裹到前面。只要缓冲区可以容纳的数据的一半已被处理,您应该再次进行读取以重新填充。您的缓冲区大小应至少是您需要识别的最大“单词”的两倍。索引到此缓冲区将使用模数(余数)运算符%来执行换行(如果选择2的幂的缓冲区大小,例如4096,则可以使用按位&代替)。

现在你只要看一下这些角色,直到你读到$,输出你到目前为止看到的东西,然后知道你处于不同的状态,因为你看到{{1}你看到更多的字符,直到你看到另一个字符结束当前状态($)并对你读过的数据执行一些其他操作。如何处理$没有看到$的情况格式良好的数字后跟一个;在您的问题中并不完全清楚 - 例如,如果您看到;之前有一百万个数字该怎么办。

正则表达式为:

;

任何非美元符号字符。这可以通过闭包( [^$] [^$]*)来增强,以便一次识别一串非[^$]+字符,但这可能会很长。

$

这会识别一个美元符号,然后是1到3位后跟一个分号。

$[0-9]{1,3};

这只会识别一个美元符号。它在括号中,因为[$] 在许多正则表达式表示中是特殊的,当它位于符号的末尾时(在这种情况下是这样)并且意味着“仅在行的末尾匹配”。

无论如何,在这种情况下,它会识别一个美元符号,在这种情况下,它不会被另一个更长的识别美元符号的模式所识别。

在lex中你可能有

$

它将生成一个.c文件,该文件将作为类似于您要求的过滤器。您需要详细了解如何使用 lex

答案 1 :(得分:0)

<stdio.h>中的“f”系列函数可以为您处理流式传输。具体来说,您正在寻找fopen()fgets()fread()等。

Nategoose关于使用lex的答案(我将添加yacc,具体取决于您输入的复杂程度)也值得考虑。它们生成有效的词法分析器和解析器,在你使用它们之后,你再也不会手工编写它们了。