C 分析控制字符串的数据流

C 分析控制字符串的数据流,c,parsing,C,Parsing,我觉得这是一个很常见的问题,但我真的不确定该搜索什么 我有一个大文件(所以我不想把它全部加载到内存中),我需要解析控制字符串,然后将数据流到另一台计算机。我目前正在读取文件中的1000字节块 例如,如果我有一个字符串,其中包含ASCII码,并用(“$”一些数字“;”)转义,数据如下所示。。。“quick$33;brown$126;fox$a$12a”。连接到另一台计算机的字符串应该是“quick brown!~fox$a$12a” 在我目前的方法中,我有以下问题: 当控制字符串落在缓冲区边界上

我觉得这是一个很常见的问题,但我真的不确定该搜索什么

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

例如,如果我有一个字符串,其中包含ASCII码,并用(“$”一些数字“;”)转义,数据如下所示。。。“quick$33;brown$126;fox$a$12a”。连接到另一台计算机的字符串应该是“quick brown!~fox$a$12a”

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

  • 当控制字符串落在缓冲区边界上时会发生什么
  • 如果字符串是“$”后跟除数字以外的任何字符和“;”我想忽略它。所以我需要提前阅读,直到找到完整的控制字符串
我是用C语言写的,所以我没有流来帮助我


交替双缓冲区方法有效吗?如果有效,如何管理当前位置等。

如果我遵循了您所问的词法分析或标记化或正则表达式。对于常规语言,您可以构造一个有限状态机来识别您的输入。实际上,您可以使用理解正则表达式的工具来识别和执行输入的不同操作

根据不同的需求,您可能会采取不同的做法。对于更复杂的语言,您可能希望使用像
lex
这样的工具来帮助您生成输入处理器,但对于这一点,据我所知,在我们解决了缓冲区问题之后,您可以使用更简单的方法

你应该为你的输入使用一个循环缓冲区,这样结束后的索引又回到了前面。只要缓冲区可以保存的数据有一半已经处理完毕,您就应该进行另一次读取以重新填充该数据。您的缓冲区大小应该至少是您需要识别的最大“字”的两倍。对此缓冲区的索引将使用模数(余数)运算符
%
执行换行(如果选择的缓冲区大小为2的幂,例如4096,则可以使用按位
&

现在,您只需查看字符,直到您阅读一个
$
,输出您在该点之前所查看的内容,然后知道您处于不同的状态,因为您看到了一个
$
,您会查看更多字符,直到看到另一个字符结束当前状态(即
)并对读入的数据执行其他操作。如何处理看到$时没有格式良好的数字后跟一个字符的情况;在你的问题中不完全清楚——如果在你看到
之前有一百万个数字怎么办

正则表达式将是:

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

$[0-9]{1,3};
这将识别一个美元符号,后跟最多1到3个数字和分号

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

无论如何,在这种情况下,它可以识别一个美元符号,而另一个更长的模式无法识别美元符号

在莱克斯,你可能有

[^$]{1,1024}          { write_string(yytext); }
$[0-9]{1,3};          { write_char(atoi(yytext)); }
[$]                   { write_char(*yytext); }
它将生成一个.c文件,该文件的功能类似于您所要求的过滤器。不过,您需要进一步了解如何使用lex。

中的“f”系列函数可以为您提供流媒体服务。具体来说,您要查找的是
fopen()
fgets()
fread()
,等等


Nategose关于使用
lex
(我将根据输入的复杂性添加
yacc
)的回答也值得考虑。它们生成了能够工作的词法分析器和语法分析器,在您使用它们之后,您再也不会手工编写它们了。

这正是我开始工作所需要的。谢谢我最终找到了一个重量轻的雷克瑟