PASCAL读命令 [英] Pascal read command
问题描述
我使用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屋!