我觉得这是一个非常常见的问题,但我不确定要搜索什么。
我有一个大文件(因此我不想将其全部加载到内存中)我需要解析控制字符串,然后将该数据流式传输到另一台计算机。我目前正在以1000字节块的形式读取文件。
例如,如果我有一个字符串,其中包含转义为('$'一些数字';')的ASCII代码,数据看起来像这样......“快速$ 33;棕色$ 126; fox $ a $ 12a ”。进入另一台计算机的字符串将是“快速棕色!~fox $ a $ 12a”。
在我目前的方法中,我遇到以下问题:
我是用直接的C写的,所以我没有流来帮助我。
交替双缓冲方法是否有效,如果是,那么如何管理当前位置等。
答案 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
,具体取决于您输入的复杂程度)也值得考虑。它们生成有效的词法分析器和解析器,在你使用它们之后,你再也不会手工编写它们了。