【问题标题】:PostScript's readstring: Is there a more efficient way to parse lines?PostScript 的 readstring:有没有更有效的方法来解析行?
【发布时间】:2019-06-11 01:11:42
【问题描述】:

我的一个非常古老的用于解析输入行的 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

是否有更有效的方法来读取整行以进行进一步处理?

我想将数据嵌入到文件中,每一行都描述一个线段。 每行由多个数字字段组成,由 TAB 字符分隔(因此我将这些行拆分为字段,并将字段字符串转换为 intreal 以便于处理)。

当然,我可以在外部转换绘图数据(例如转换为 PostSript 数组),但我的想法是为每个数据文件添加一些固定的魔法 PostScript 标头,它会渲染数据...

【问题讨论】:

  • 老实说可能会更好,因为没有图形问题。尽管您没有定义为什么要首先解析我。最好是通过一个列表。
  • 同时我尝试了这种方法:一次读取一个大缓冲区中的所有内容(假设文件不是很大),然后使用search 构建一个行数组。
  • 您可以使用 readline 代替 readstring,假设您的行以 \n、\r 或两者结尾。这样您就不必逐字节读取,并检查每个字符是否有 EOL,这样会更快。取决于“...”内容的两个可能问题;首先,EOL 未存储在字符串中,其次,如果字符串不足以从文件中读取整行,则会出现范围检查错误。 Adobe PostScript 解释器中的字符串限制为 64Kb,因此您应该将其视为您可以定义的最大字符串..
  • 还有 SubFileDecode 过滤器,可能是合适的,但这取决于您在读取数据后对数据进行的处理。

标签: algorithm performance postscript


【解决方案1】:

类似的东西怎么样? readline 为您处理行(直到解释器定义的字符串容量)。 token 处理跳过空格并将数字适当地转换为实数或整数。

另请注意,文件读取运算符的布尔结果可用于提前退出循环,这似乎很有效。

/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多