2010-11-13 124 views
2

我有兴趣编写修改PostScript文件的实用程序。它需要遍历文件,对页数和尺寸做出特定决定,然后将输出写入文件或标准输出,对PostScript代码进行某些修改。用C读取并管道大文件

在这种情况下,在* NIX系统上处理文件处理的好方法是什么?我对C中的管道和分叉是相当陌生的,而且我的理解是,如果直接读取文件,我可能会在输入文件中来回查找,但如果直接将输入输入到程序中,不能简单地回溯到输入的开始,因为输入可能是网络流,例如,是否正确?

与其将整个PS文件存储到内存中,这可能会变得非常庞大,似乎在我第一次分析页面时将输入缓冲到磁盘会更有意义,然后从临时文件重新读取,产生输出,并删除临时文件。如果这是一个可行的解决方案,那么将这个文件存储在* NIX系统中是个好地方呢?我不确定这样的代码有多安全:该程序可能会被同一台服务器上的多个用户使用。这听起来像我会确保将文件保存在给定用户帐户唯一的临时目录中的某个位置,并且为磁盘上的临时文件提供一个相当独特的名称。

希望在这个令人迷惑的文件处理世界的任何提示和指针。

回答

4

使用mkstemp(3)创建临时文件。它会为你处理并发问题。 mmap(2)可以让你在放弃的情况下在文件中移动。

+0

这很完美!尽管我确实觉得我在避免学习临时文件创建并发性:) :) – dmkc 2010-11-13 18:55:59

+0

'mkstemp'和'mktemp'有什么区别? – helpermethod 2010-11-13 19:36:09

+0

@Helper:正如'mktemp(3)'手册页给出的那样,'mktemp()'有几个安全问题。 – 2010-11-13 19:55:59

1

如果输入直接传送到程序中,我不能简单地倒回到输入的开始处,因为输入可能是网络流,例如正确吗?

这是正确的。您只能对文件执行随机访问。

如果您阅读了该文件,也许您可​​以构建一张元数据表,稍后您可以使用该元数据表来查找文件的特定部分,而无需将文件保存在内存中。