被 Pascal 的 'write' 搞糊涂了

Confused by the 'write' of Pascal

我了解到: write('test'); 将在屏幕上打印 "test", 而

program testpro;
var 
outfile:Text;
begin
assign(outfile, 'outfile.txt');
rewrite(outfile);
write(outfile, 'test');
end;

将 "test" 写入文件 outfile.txt。

下面的代码尝试执行将字符打印到屏幕和将字符写入文件的操作。

program doboth(input, output)
begin
  assign(input, 'infile.txt');
  assign(output, 'outfile.txt');
  reset(input);
  rewrite(output);
  procedure getcharfrominput;

  begin
  {procedure to read char one by one from infile and write the read char}
  { to out file and print on the screen in the same time}
      ...
      write(ch);         {ch is expected to be printed on the screen}
      write(output, ch); {ch is expected to be wrote to the outfile.txt}
      ...
   end;{procedure getcharfrominput}

begin
   getcharfrominput;
end;{program doboth}

但结果是读取的char被写入outfile.txt两次而屏幕没有任何输出(这意味着write(ch);也将char写入文件而不是屏幕);

然后我更改 'input' 和 'output' 变量的声明并获得以下代码:

program doboth;         {remove input output}
var input, output:text; {declare input and output here}
begin                   {the rest of the code is the same}
  assign(input, 'infile.txt');
  assign(output, 'outfile.txt');
  reset(input);
  rewrite(output);
  procedure getcharfrominput;

  begin
  {procedure to read char one by one from infile and write the read char}
  { to out file and print on the screen in the same time}
      ...
      write(ch);         {ch is expected to be printed on the screen}
      write(output, ch); {ch is expected to be wrote to the outfile.txt}
      ...
   end;{procedure getcharfrominput}

begin
   getcharfrominput;
end;{program doboth}

然后我得到的结果是want.But我还是不知道为什么这样操作就可以解决这个问题

前段时间,程序习惯于从键盘获取输入并将输出写入控制台(文本屏幕)或文本文件。 主程序的参数输入和输出使这一点变得明确,并提供了一种 'redirect' 输入和输出的方法。 IE。您可以将文本文件与输入 and/or 输出相关联。就像Ianx86在他的程序中所做的那样。

所以, Readln(ch) 从输入中读取。 Writeln(ch) 写入输出。

现在,如果您将输出与文本文件相关联('redirect'), Writeln(ch) 和 Writeln(output, ch) 变得相同,即 Writeln(ch) 不再写入控制台,而是写入文本文件。

备注:

有人提到作为主程序参数的(输入,输出)被忽略了。 这似乎是正确的。 如果将其替换为 (inp, outp), "input" 和 "output" 仍然可以用作全局变量,而 "inp" 和 "outp" 是未声明的标识符。 恕我直言,这是一个编译器错误。