【问题标题】:Pascal read command帕斯卡读命令
【发布时间】:2021-04-05 18:54:50
【问题描述】:

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

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

但是为什么呢?

    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;         


【问题讨论】:

  • 我建议你阅读这个问题:stackoverflow.com/q/48099891/2663863 和@TomBrunberg 对此的回答。
  • 非常感谢。你知道我是否可以使用 read(something) 并清除缓冲区中的 eol 以及如何?我在论坛上看到了一些东西,但是在尝试清除缓冲区时它对我不起作用。但无论如何,我可以使用 gotoxy(x,y) 通过 readln 转到我想要下一个输入的位置。即使没有使用太多的 gotoxy,因为我意识到处理速度很慢......
  • 如何回答?请回答我的朋友关闭帖子?

标签: pascal


【解决方案1】:

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

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

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

说明

可以通过以下方式在 Delphi 代码中使用 Read 过程。

对于类型化文件,它将文件组件读入变量。 对于文本文件,它将一个或多个值读入一个或多个变量中。

使用类型字符串变量:

Read 读取所有字符,直到(但不包括)下一个行尾标记或直到 Eof(F) 变为真;阅读后不会跳到下一行。如果结果字符串长于字符串变量的最大长度,则将其截断。 在第一次读取之后,每个后续读取都会看到行尾标记并返回一个长度为零的字符串。

使用多个 Readln 调用来读取连续的字符串值。[强调添加]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多