所以我试图登录一个程序,只需通过文本文件检查ID(用户名)和密码,但我得到了这个代码的I/O错误103,我无法弄清楚原因.我处于一个非常基本的delphi级别,对于糟糕的代码等抱歉
procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
ID, Password: String;
PATLogins: TextFile;
checkpass, checkID: String;
correctpass, correctID: Boolean;
begin
ID:= edtID.Text;
Password:= edtPassword.Text;
correctID:= False;
correctpass:= False;
AssignFile(PATLogins, 'PATLogins.txt');
CloseFile(PATLogins);
Reset(PATLogins);
while ((NOT EOF(PATLogins)) OR (checkID = ID)) do
begin
ReadLn(PATLogins, checkID);
end;
if (checkID = ID) then
begin
correctID:= True;
end;
if EOF then
begin
ShowMessage('Incorrect ID');
edtID.Clear;
end;
CloseFile(PATLogins);
reset(PATLogins);
while ((NOT EOF(PATLogins)) OR (checkpass = Password)) do
begin
ReadLn(PATLogins, checkpass);
end;
if (checkpass = Password) then
begin
correctpass:= True;
end;
if EOF then
begin
ShowMessage('Incorrect Password');
edtPassword.Clear;
end;
CloseFile(PATLogins);
if (correctID = True) AND (correctpass = True) then
begin
frmLogin.Close;
end;
end;
Run Code Online (Sandbox Code Playgroud)
你在文件打开之前关闭它.AssignFile不会打开任何文件.它只是设置给定TextFile变量,以便将来的文件操作(如Reset或Rewrite)知道要使用哪个文件名.删除第一个CloseFile电话 - 使用后立即拨打电话AssignFile.
请不要删除所有的CloseFile,因为你显然希望处理同一个文件两次电话.您需要关闭并重新打开该文件才能正常工作,这是您当前代码已正确执行的操作.
(你真的不想两次处理文件.你当前的算法允许任何用户名或密码都可以作为用户名提供,任何密码或用户名都可以作为密码提供.这意味着没有人需要密码,因为用户名可以作为密码.您需要重新考虑如何进行身份验证,但这超出了本问题的范围.)