帕斯卡读命令

Pascal read command

我使用 FPC 在 pascal 中构建了一个程序,但在此之后我安装了 lazarus。所以现在我正在 Lazarus 中编辑这个相同的 pascal 程序。 在这种类型的记录数组中插入、修改和列出名称、姓氏和电话非常有效。 但是在这个修改过程中,读取命令对我不起作用。 但是读取命令在我的删除过程中运行良好。

主要问题: **这 3 个读取命令不起作用,所以我修改为 readln,它为我修复了它,现在每个读取命令都读取我的输入,但只使用 readln,而不是读取。 **

但是为什么呢?

    gotoxy(24,8);
    read(modificar_nome);
    gotoxy(24,9);
    read(modificar_sobrenome);
    gotoxy(24,10);
    read(modificar_telefone); 

完成程序

//---------------------------------------
// MODIFICAR escolha
//---------------------------------------
procedure modificar_pessoa(var pessoa: type_pessoas);
var i,achou: integer;
var buscar_pessoa, modificar_nome, modificar_sobrenome, modificar_telefone: string;

begin

  clrscr;
  writeln('****************************************************************************************');
  writeln('* Modificar pessoa                                                                     *');
  writeln('****************************************************************************************');
  writeln('* Nome:                                                                                *');
  writeln('****************************************************************************************');
  gotoxy(9,4); readln(buscar_pessoa);
  
  for i:=0 to length(pessoa)-1 do
  begin
    if (pessoa[i].primeiro_nome = buscar_pessoa) then
    begin
      achou := 1;
      break;
    end;
  end;

  if achou = 1 then
  begin
    writeln('****************************************************************************************');
    writeln('* Preencher so o que deseja modificar (ou ENTER para ignorar):                         *');
    writeln('****************************************************************************************');
    writeln('* Novo Primeiro Nome?                                                                  *');
    writeln('* Novo Sobrenome?                                                                      *');
    writeln('* Novo Telefone?                                                                       *');
    writeln('****************************************************************************************');
    gotoxy(24,8);
    read(modificar_nome); // not waiting for my input ???????????
    gotoxy(24,9);
    read(modificar_sobrenome);
    gotoxy(24,10);
    read(modificar_telefone);

    if modificar_nome <> '' then
      pessoa[i].primeiro_nome := modificar_nome;

    if modificar_sobrenome <> '' then
      pessoa[i].ultimo_nome := modificar_sobrenome;

    if modificar_telefone <> '' then
      pessoa[i].telefone := modificar_telefone;

    gotoxy(1,13);
    writeln;
    writeln('Pessoa ''', buscar_pessoa, ''' modificada com sucesso!');
  end
  else
    begin
      gotoxy(1,13);
      writeln;
      writeln('ERRO: Pessoa ''', buscar_pessoa, ''' não foi localizada!');
    end;

  writeln;
  writeln('Pressione qualquer tecla para retornar ao menu...'); ReadAnyKey;

end;

有趣的是这个删除(排除)人员的程序,读取命令工作正常并等待我的输入

//---------------------------------------
// EXCLUIR escolha
//---------------------------------------
procedure excluir_pessoa(var pessoa: type_pessoas);
var i,achou: integer;
var del_pessoa: string;

begin

  clrscr;
  writeln('****************************************************************************************');
  writeln('* Excluir pessoa                                                                       *');
  writeln('****************************************************************************************');
  writeln('* Nome:                                                                                *');
  writeln('****************************************************************************************');

  gotoxy(9,4); read(del_pessoa);

  for i:=0 to length(pessoa)-1 do
  begin
    if (pessoa[i].primeiro_nome = del_pessoa) then
    begin
      achou := 1;
      pessoa[i].primeiro_nome := '';
      pessoa[i].ultimo_nome   := '';
      pessoa[i].telefone      := '';
      break;
    end;
  end;

  gotoxy(1,6);
  if achou = 1 then
    writeln('Pessoa ''', del_pessoa, ''' excluida com sucesso!')
  else
    writeln('ERRO: Pessoa ''', del_pessoa, ''' nao foi localizada!');

  writeln;
  writeln('Pressione qualquer tecla para retornar ao menu...'); ReadAnyKey;

end;         


我认为对此的简短回答是您的观察是正确的,原因是 Read 正在按设计工作。一旦 FPC 的运行时执行了第一个 Read,它的行为就好像它在用户键入的内容之后看到了 Eol,因此第二次和后续调用 Read return 立即无需等待任何进一步的用户输入。

它这样做的原因似乎是历史原因。 FPC 基于商业 RAD 系统 Delphi 的 Object Pascal,尽管多年来两者有所不同(例如,在泛型的不同实现上),FPC 忠实地再现了 Object Pascal 的许多基本细节语言和运行时,包括其文件处理,其中键盘输入是一种特殊情况。

我认为这是合法的。因此,要查看 Read 的 Delphi/Object Pasval 文档。在 20 年前的 Delphi 7 联机帮助中,关于 Read 的部分包括

Description

The Read procedure can be used in Delphi code in the following ways.

For typed files, it reads a file component into a variable. For text files, it reads one or more values into one or more variables.

With a type string variable:

Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes true; it does not skip to the next line after reading. If the resulting string is longer than the maximum length of the string variable, it is truncated. After the first Read, each subsequent Read sees the end-of-line marker and returns a zero-length string.

Use multiple Readln calls to read successive string values.[emphasis added]

因此,Delphi OLH 准确地记录了您所看到的行为(第二次和后续调用 Read return 立即没有收集任何用户输入)and描述了补救措施,就是用Readln代替。这就是为什么您会在 FPC 中看到相同的行为 + 补救措施。