在标准Pascal(ISO7185)中,没有程序Assign
可以让程序员将某种文件名分配给文件变量。它只出现在Turbo Pascal和其他衍生物中。
那么......如果我遵守标准,我应该如何打开特定文件的句柄?
我发现最近的是Irie Pascal example:
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编译器,我得到(在替换'否则'之后)**** 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.
但我无法使用任何编译器。
EDIT2:
这样做:
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.
在Irie中工作得很好,并且符合标准。使用它,文件名可以作为启动参数。
但是,explained by Marco van de Voort,
ISO 7185没有任何标准方式供程序指定 文件名,所以任何这样的方式已经超过7185(Bind 是ISO 10206,Assign是UCSD / BP,Reset的第二个参数是 GPC的扩展,我想其他一些编译器。)
(source)
答案 0 :(得分:2)
IIRC这是针对VMS支持的,其中操作系统在启动程序之前绑定文件。
未绑定的文件是自动临时文件iirc。搜索GNU Pascal maillists(旧档案,比如2005年左右),他们对ISO文件实现进行了一些讨论。
答案 1 :(得分:1)
这是CDC 6000系列机器上的Scope。但是,其余的都是正确的。您基本上将外部文件分配给Scope命令语言中的逻辑头文件名。
当然这现在看起来非常繁琐,但这些是批处理模式计算机的日子,其中所有内容都作为卡片“套牌”提交作为输入运行,然后作为一系列输出“卡片”收集。磁带卷取消了实际卡片,但磁带被视为磁带上的卡片集合。
在正常使用中,Wirth的原始编译器实际上仅限于输入和输出文件。如果您想要多个输入文件,请将它们连接起来。这比听起来容易,因为大多数输入和输出文件都是文本,并且每个文件都有不同的结束标记。
这种模式非常适合在批处理系统上为作业安装输入磁带和输出磁带的想法。批处理计算机的工作是线性处理输入磁带并生成输出磁带。一台大而快的机器可以将多个作业连接到一个磁带上并按顺序运行。
高速打印机的选项通常会使系统更加完善。因此,一个20世纪60年代学习计算机科学的大学生会在看起来像打字机(或由钥匙扣操作员打字)上打一副牌,然后该牌组将被收集并转录到磁带卡座并计划运行。一小时或更长时间后,您从打印机处获得了一段代表程序输出的绿栏。
无论如何,它总是一个很好的辩论问题,为什么Wirth把这种限制放在语言中。 Probabaly的原因很简单,因为CDC 6000机器无法处理随机打开文件名的功能。还要记住,Pascal的前身Algol没有任何I / O语句!他们认为I / O具有固有的机器特性。
Scott Moore