1

在标准 Pascal ( ISO7185 ) 中,没有任何程序Assign可以让程序员将某种文件名分配给文件变量。它只出现在 Turbo Pascal 和其他衍生产品中。

那么......如果我遵守标准,我应该如何打开特定文件的句柄?

我发现最接近的是这个Irie Pascal 示例

program vowels(f, output);
var
   f : file of char;
   tot, vow : integer;
   c : char;
begin
   reset(f);
   tot := 0;
   vow := 0;
   while not eof(f) do
      begin
         read(f, c);
         case c of
            'a', 'e', 'i', 'o', 'u',
            'A', 'E', 'I', 'O', 'U'
               : vow := vow + 1;
            otherwise
         end;
         tot := tot + 1;
      end;
   writeln('Total characters read = ', tot);
   writeln('Vowels read = ', vow)
end.

这表明我可以将文件名作为启动参数。这使用 Irie Pascal 有效。但是,如果我尝试将它与P5一起使用,它应该最接近我发现的现代计算机的标准兼容 Pascal 编译器,我得到 (在替换 'otherwise' 之后) **** Error: external file unknown 'f '。那么,标准方法是什么?或者这实际上是标准方式并且 P5 做错了什么?

编辑:标准也给出了一个样本

program copy (f, g);
  var f,g : file of real;
begin
  reset(f) ; rewrite(g);
  while not eof(f) do
    begin
      g^ := f^ ; get(f) ; put(g)
    end
end.

但我无法让它与任何编译器一起工作。

编辑2:

这样做:

program copy (f, g);
  var f,g : file of char;
begin
  reset(f) ; rewrite(g);
  while not eof(f) do
    begin
      g^ := f^ ; get(f) ; put(g)
    end
end.

在入江工作得很好并且符合标准。使用它,文件名可以作为启动参数给出。

然而,正如Marco van de Voort所解释的,

ISO 7185 根本没有程序指定文件名的任何标准方式,因此任何此类方式都已超出 7185(Bind 是 ISO 10206,Assign 是 UCSD/BP,Reset 的第二个参数是 GPC 的扩展和 I想想其他一些编译器)。

来源

4

2 回答 2

2

IIRC 这是为了在启动程序之前操作系统绑定文件的 VMS 支持。

未绑定的文件自动为 tempfile iirc。搜索 GNU Pascal 邮件列表(旧档案,比如 2005 年左右),他们对 ISO 文件实现进行了相当多的讨论。

于 2013-02-20T10:09:02.200 回答
1

它是 CDC 6000 系列机器上的 Scope。但是,其余的都是正确的。您基本上将外部文件分配给 Scope 命令语言中的逻辑头文件名。

当然,现在这看起来很乏味,但那是批处理模式计算机的时代,所有东西都作为输入的卡片“甲板”提交,然后作为一系列输出“卡片”收集。磁带卷轴摆脱了实际的卡片,但磁带被视为磁带上的卡片集合。

在正常使用中,Wirth 的原始编译器实际上仅限于输入和输出文件。如果您想要多个输入文件,请将它们连接起来。这比听起来容易,因为大多数输入和输出文件都是文本,并且每个文件都有不同的结束标记。

这种范例非常适合您为批处理系统上的作业安装输入磁带和输出磁带的想法。批处理计算机的工作是线性处理输入磁带并产生输出磁带。一台大而快的机器会将多个作业连接到一个磁带上并按顺序运行。

高速打印机的选择通常完善了系统。因此,一个在 1960 年代学习计算机科学的大学生会在看起来像打字机的东西上打一个卡座(或让键盘打孔操作员打字),然后该卡座将被收集并转录到磁带卡座并计划运行。一个小时或更长时间后,您从打印机收到了代表程序输出的绿条部分。

无论如何,关于为什么 Wirth 将这种限制放在语言中,这始终是一个很好的辩论问题。可能原因很简单,CDC 6000 机器无法处理按名称随机打开文件的功能。还要记住,Pascal 的前身 Algol 没有任何 I/O 语句!他们认为 I/O 本质上是特定于机器的。

斯科特·摩尔

于 2013-11-09T00:08:22.640 回答