如果用户按下Enter键盘,为什么Read程序插入New Line?

时间:2019-05-21 23:57:17

标签: console-application pascal freepascal

我试图在Free Pascal IDE中使用“读取”过程而不是“ ReadLn”,但是当我在输入值后按Enter时,我得到一个新行,如“ readln”。...

program test;
uses
  crt;
var
  AName: string[20];

function Complete_Rectangle(ALength_NewValue, ALength_Rectangle, ALength_Pref: byte): string;
const
  Stars : string = '**';
var
  Space_Str: string;
  I,
  Space_Needed : byte;
begin
  Space_Needed := ALength_Rectangle - ALength_Pref; (* Calculate Needed Space.... *)
  Space_Str  := '';

  for I:=1 to Space_Needed -(ALength_NewValue + 2) do  (* 2 represent the length of Stars Constant *)
  begin
    Space_Str := Space_Str + ' ';
  end;

  Complete_Rectangle := Space_Str + Stars;
end;

begin
  clrscr;
  writeln('**********************************************************************');
  writeln('**                                                                  **');
    write('**  [*] add your Name here: '); read(AName); writeln(Complete_Rectangle(length(AName), 70, 28));
    (* 70 represent the length of rectangle spaces and 28 represent the length of this prefix text "**  [*] add your Name here: " *)
  writeln('**                                                                  **');
  writeln('**********************************************************************');
  readkey;
end.

是否可以创建自己的自定义阅读以解决上述问题? 我在这里有此代码,但似乎无法正常工作...:

procedure Lire(AVariant: Variant);
var
  I: byte;
  AKey: Char;
  AReadStr: String;
begin
  I := 1;
  AReadStr := '';
  AKey := char('');

  repeat
    AKey := ReadKey;
    if not (AKey = #13) then
    begin
      AReadStr[I] := AKey;
      write(AKey);
      inc(I);
    end;
  Until AKey = #13;
  case varType(AVariant) of
    varString: begin AVariant := AReadStr; end;
    varInteger: begin AVariant := StrToInt(AReadStr); end;
    varByte: begin AVariant := StrToInt(AReadStr); end;
    varBoolean: begin AVariant := StrToBool(AReadStr); end;
    (* ..... and so on *)
  end;


end;

1 个答案:

答案 0 :(得分:1)

Read和Readln语句对于从键盘获取输入从文件读取数据都是通用的。

关于文档的 Readln

  

从文件F中读取一个或多个值,并将结果存储在V1中,   V2等。之后,转到文件的下一行

关于从文档中阅读

  

从文件F中读取一个或多个值,并将结果存储在V1中,   V2等

因此,从文件中读取时,readln会转到下一行,而read不会。但这不是控制台输入的预期行为。

如果您确实想将光标放在屏幕上,我建议您使用旧的getXY命令,该命令在FreePascal中也可用。 Link to gotoXY

例如:

write('**  [*] add your Name here: '); 
read(AName); 
gotoXY(28 + length(AName)+ 1, WhereY-1); // Repositionate the cursor to the right Position.
writeln(Complete_Rectangle(length(AName), 70, 28));