PASCAL读命令 [英] Pascal read command

查看:0
本文介绍了PASCAL读命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用FPC用Pascal构建了一个程序,但在此之后我安装了Lazarus。所以现在我正在用拉撒路编辑同样的帕斯卡程序。 它可以很好地在这种类型的记录数组中插入、修改和列出姓名和电话。 但是在这个修改过程中,Read命令对我不起作用。 但例如,Read命令在我的Delete过程中工作得很好。

主要问题: **这3个Read命令不起作用,所以我修改为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;

有趣的是,删除(排除)人员的另一个过程是,Read命令运行良好,并等待我的输入

//---------------------------------------
// 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的第二个和后续调用立即返回,而无需等待任何进一步的用户输入。

它这样做的原因似乎是历史性的。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中看到同样的行为+补救措施。

这篇关于PASCAL读命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆