Algorithm 附言';s readstring:有没有更有效的方法来解析行?

Algorithm 附言';s readstring:有没有更有效的方法来解析行?,algorithm,performance,postscript,Algorithm,Performance,Postscript,我的一个非常古老的PostScript代码解析输入行,如下所示: /buff 1 string def % check for line wrap every character /EOLchar (\n) def % line feed { %loop currentfile buff readstring exch dup EOLchar eq { %ifelse %... } { %else

我的一个非常古老的PostScript代码解析输入行,如下所示:

/buff 1 string def      % check for line wrap every character
/EOLchar (\n) def       % line feed

{ %loop
        currentfile buff readstring exch
        dup EOLchar eq
    { %ifelse
        %...
    }
    { %else
        %...
    } ifelse
    not { %if readstring found EOF
        exit    % end of file
    } if
} loop
有没有更有效的方法来读取整行数据以便进一步处理

我想把要绘图的数据嵌入到文件中,每一行都会描述一个线段。 每一行由多个数字字段组成,由一个制表符分隔(因此我将把这些行拆分为字段,并将字段字符串转换为
int
real
,以便于处理)


当然,我可以在外部转换绘图数据(例如,转换为PostSript数组),但我的想法是在每个数据文件中添加一些固定的magic PostScript头,然后它将呈现数据…

类似的东西怎么样?
readline
为您处理行(最大为解释器定义的字符串容量)<代码>标记处理跳过空白和将数字转换为实数或整数(视情况而定)

还要注意,文件读取操作符的布尔结果可以用于提前退出循环,这似乎很有效

/buf 65535 string def
/f currentfile def
{
  f buf readline not {exit} if
  { token {exch}{exit} ifelse } loop
  {lineto} stopped {moveto} if
} loop
100 200
300 400
500 600

也许最好这么诚实地问下去,因为没有图形问题。虽然你没有定义你为什么要首先解析i。最好是传递一个列表。在此期间,我尝试了这种方法:在一个大缓冲区中一次性读取所有内容(假设文件不是很大),然后使用
search
构建一个行数组。您可以使用readline而不是readstring,假设行以\n、\r或两者结尾。这就省去了一个字节一个字节地读取数据,并检查每个字符的下线,这样会更快。两个可能的问题取决于“…”内容;首先,EOL没有存储在字符串中,其次,如果字符串的长度不够,无法从文件中读取整行,则会出现rangecheck错误。Adobe PostScript解释器中的字符串限制为64Kb,因此您应该将其视为您可以定义的最大字符串。还有子文件解码筛选器,这可能是适当的,但它取决于您在读取数据后对数据所做的操作。