delphi 控制台 输入输出

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

type
  TFriend = record
    name: string[10];
    age : integer;
  end;
  PFriend = ^TFriend;

var
  FriendList    : TList;
  FriendFileName: string;
  
//const
//  LeftTop    = '';
//  LeftBottom = '';
//
//  Level      = '';
//
//  RightBottom = '';
//  RightTop    = '';
//
//  Cross       = '';
//
//  Vertical    = '';
//
//  Right       = '';
//  Left        = '';
//
//  Bottom      = '';
//  Top         = '';

procedure LoadFriendFrmFile();
  procedure AddFriendItem(S: string);
  var
    strList: TStringList;
    P: PFriend;
  begin
    if Length(s) < 0  then exit;
    strList := TStringList.Create();
    try
      strList.Delimiter := '|';
      strList.DelimitedText := S;

      New(p);
      P^.name := strList.Strings[0];
      P^.age  := strToIntDef(strList.Strings[1], -1);

      FriendList.Add(P);

    finally
      strList.Free();
    end;
  end;
var
  F: TextFile;
  S: string;
begin
  if not FileExists(FriendFileName) then exit;
  AssignFile(F, FriendFileName);
  try
    Reset(F);
    while not Eof(F) do
    begin
      Readln(F, S);
      AddFriendItem(S);
    end;
  finally
    CloseFile(F);
  end;
end;

procedure SaveFriendToFile();
var
  F: TextFile;
  S: string;
  I: integer;
  P: PFriend;
begin
  if not Assigned(FriendList) then exit;
  if FriendList.Count <= 0 then
  
  AssignFile(F, FriendFileName);
  try
    ReWrite(F);
    for i := 0 to FriendList.Count - 1 do
    begin
      P := FriendList.Items[I];
      S := P^.name + '|' + IntToStr(P^.age);
      Writeln(s);
    end;
  finally
    CloseFile(F);
  end;
end;

procedure Description();
begin
  Writeln('┏━━━━━━━━━━━━━━┓');
  Writeln('┃         好友管理           ┃');
  Writeln('┃============================┃');
  Writeln('┃1.A/a 添加新的好友。        ┃');
  Writeln('┃2.M/m 修改好友年龄信息。    ┃');
  Writeln('┃3.D/d 通过好友姓名删除好友。┃');
  Writeln('┃4.P/p 查看好友信息。        ┃');
  Writeln('┃5.F/f 查找好友信息。        ┃');
  Writeln('┃6.E/e 退出。                ┃');
  Writeln('┗━━━━━━━━━━━━━━┛');
end;

function CheckStr(S: string): boolean;
var
  i: integer;
const
  FLAG = '!@#$%^&*()_+-=[]{},./<>?:"|;''\0123456789';

begin
  Result := false;
  for i := 1 to Length(FLAG) do
  begin
    if Pos(FLAG[i], S) > 0 then
    begin
      Result := true;
      Writeln('输入的姓名不合法!');
      break;
    end;
  end;
end;

function GetName(): string;
var
  S: string;
begin
  repeat
    write('请输入姓名: ');
    ReadLn(s);
  until ((Length(s) <= 10) and (not CheckStr(s)));
  Result := S;
end;

function GetAge(): integer;
var
  S: string;
  R: integer;
begin
  R := -1;

  while TRUE do
  begin
    write('请输入年龄: ');
    ReadLn(S);
    if ((not TryStrToInt(S, R)) and (R <= 0)) then
      writeln('输入的年龄不合法')
    else
      break;
  end;

  Result := R;
end;

procedure AddFriend();
var
  P: PFriend;
begin
  New(p);
  P^.name := GetName();
  P^.age  := GetAge();
  FriendList.Add(P);
end;

function GetFriendFrmName(name: string): PFriend;
var
  I: integer;
  P: PFriend;
begin
  Result := nil;
  for I := 0 to FriendList.Count - 1 do
  begin
    P := FriendList.Items[I];
    if P^.name = name then
    begin
      Result :=  P;
      break;
    end;
  end;
end;

procedure ModifyFriend();
var
  P: PFriend;
begin
  P := GetFriendFrmName(GetName());
  if Assigned(p) then
  begin
    P^.age := GetAge();
  end
  else
    Writeln('好友不存在!');
end;

procedure DeleteFriend();
var
  P: PFriend;
  I: integer;
  name: string;
  B: boolean;
begin
  name := GetName();
  B := false;
  for I := 0 to FriendList.Count - 1 do
  begin
    P := FriendList.Items[I];
    if P^.name = name then
    begin
      Dispose(P);
      FriendList.Delete(I);
      B := true;
      break;
    end;
  end;

  if B = false then
    Writeln('好友不存在!');
end;

procedure PrintTitle();
begin
  Writeln('┏━━━━━┳━━━━━┳━━━━━┓');
  Writeln('┃index     ┃Name      ┃Age       ┃');
end;

procedure PrintBottom();
begin
  Writeln('┗━━━━━┻━━━━━┻━━━━━┛');
end;

procedure FindFriend();
var
  P: PFriend;
  S: string;
begin
  P := GetFriendFrmName(GetName());
  if Assigned(P) then
  begin
    PrintTitle();
    Writeln('┣━━━━━╋━━━━━╋━━━━━┫');
    Writeln(Format('┃%-10d┃%-10s┃%-10d┃', [1, P^.name, P^.age]));
    PrintBottom();
  end
  else
    Writeln('好友不存在!');
end;

procedure PrintFriend();
var
  I: integer;
  P: PFriend;
begin
  if FriendList.Count > 0 then
  begin
    PrintTitle();
    for I := 0 to FriendList.Count - 1 do
    begin
      P := FriendList.Items[I];
      Writeln('┣━━━━━╋━━━━━╋━━━━━┫');
      Writeln(Format('┃%-10d┃%-10s┃%-10d┃', [I + 1, P^.name, P^.age]));
    end;
    PrintBottom();
  end;
end;


procedure GetInput();
var
  s: string;
begin
  Description();
  write('请输入命令: ');
  Readln(s);
  while true do
  begin
    s := LowerCase(s);
    case s[1] of
    'a':
      begin
        AddFriend();
      end;
    'm':
      begin
        ModifyFriend();
      end;
    'd':
      begin
        DeleteFriend();
      end;
    'p':
      begin
        PrintFriend();
      end;
    'f':
      begin
        FindFriend();
      end;
    'e':
      begin
        break;
      end;
    else
      writeln('输入的命令不存在!');
    end;
    write('请输入命令: ');
    Readln(s);
  end;
end;

procedure InitFriend();
begin
  FriendList := TList.Create();
  LoadFriendFrmFile();
end;

procedure FreeFriend();
var
  P: PFriend;
  I: integer;
begin
  if FriendList.Count > 1 then
  begin
    repeat
      I := FriendList.Count - 1;
      P := FriendList.Items[I];
      Dispose(p);
      FriendList.Delete(I);
    until FriendList.Count = 0;
  end;

  FreeAndNil(FriendList);
end;


begin
  FriendFileName := ExtractFilePath(paramstr(0)) + 'friend.txt';
  InitFriend();
  GetInput();
  FreeFriend();
end.

// 文件的操作没有完成!!

转载于:https://www.cnblogs.com/qkhhxkj/archive/2013/01/02/2842439.html

Delphi中读取Windows控制台的内容如果遇到乱码,通常是由于字符编码不匹配导致的。Delphi默认处理的是ANSI字符集,而控制台通常使用系统本地编码(如UTF-8、GBK等)。解决这个问题需要做以下几步: 1. 确定控制台的字符编码:检查你的程序是在何种环境下运行,以及用户终端的默认设置。你可以尝试捕获控制台输入前的一些文本,通过查看是否乱码来推断其编码。 2. 转换编码:在读取控制台内容时,可以先将其从控制台的当前编码转换成Delphi能理解的字符集。例如,如果你确定是UTF-8,可以使用`TEncoding.UTF8.GetBytes`函数将字节流转换成字符串。 ```delphi var InputBuffer: array[0..1023] of byte; InputString: string; begin // 假设GetConsoleInput获取到的InputBuffer包含了控制台输入 if GetConsoleInput(0, InputBuffer, SizeOf(InputBuffer)) > 0 then begin InputString := TEncoding.UTF8.GetString(InputBuffer); // ...然后在这里处理转换后的InputString end; end; ``` 3. 设置输出编码:如果是输出到控制台,你需要设置Delphi应用的输出编码,使其与控制台一致。 4. 使用第三方库:如果内置方法不足以解决问题,可以考虑使用第三方库如` Indy UnxUtils`或` AnsiStrings`,它们提供了额外的支持来处理各种字符集。 记得在实际操作中处理编码可能会比较复杂,特别是涉及多国语言的情况,所以测试和调试非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值