Delphi I/O错误103

0 delphi file delphi-2010

所以我试图登录一个程序,只需通过文本文件检查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)

Rob*_*edy 7

你在文件打开之前关闭它.AssignFile不会打开任何文件.它只是设置给定TextFile变量,以便将来的文件操作(如ResetRewrite)知道要使用哪个文件名.删除第一个CloseFile电话 - 使用后立即拨打电话AssignFile.

请不要删除所有CloseFile,因为你显然希望处理同一个文件两次电话.您需要关闭并重新打开该文件才能正常工作,这是您当前代码已正确执行的操作.

(你真的不想两次处理文件.你当前的算法允许任何用户名或密码都可以作为用户名提供,任何密码或用户名都可以作为密码提供.这意味着没有人需要密码,因为用户名可以作为密码.您需要重新考虑如何进行身份验证,但这超出了问题的范围.)