【发布时间】:2021-10-23 09:26:53
【问题描述】:
我有一个程序应该循环浏览一个文本文件以查看用户名是否已被使用。
由于某种原因,代码没有遍历整个文件。它在 3 行后停止。我将用户名存储在 26 个文本文件中(每个字母 1 个)。它通过复制用户名的第一个字母并打开相应的文件来访问文本文件:
AssignFile(tfile, Upcase(sUsername[1]) + '.txt');
//if username is Alex, it would open 'A.txt'
例如 (用户名#密码#OtherInfo)
Alex#123#Beta
Andrew#987#Gamma
alexis#abcd#Alpha
Anderson#zxcvbnm#Gamma
我的代码会在第三个名字之后停止。
AssignFile(tfile, Upcase(sUsername[1]) + '.txt');
Reset(tfile);
while not Eof(tfile) do
begin
Readln(tfile, sline);
iPos := Pos('#', sline);
if sUsername = Copy(sline, 1, iPos - 1) then
begin
bFlag := True;
end;
end;
if bFlag = True then
begin
ShowMessage('That username is already taken');
CloseFile(tfile);
end
else
begin
Append(tfile);
Write(tfile, #13);
Write(tfile, sUsername + '#' + sPassword + '#' + rgpUserType.Items[rgpUserType.ItemIndex]); // adds new user to text file
CloseFile(tfile);
end;
为什么要这么做?
【问题讨论】:
-
如果 bFlag 是包含此代码的过程的本地变量,则在过程启动时它将具有准随机值。因此,您应该在执行
while not eof(tfile)循环之前将其值显式设置为 False。另外,考虑使用SameText函数将用户名与正在读取的行进行比较。 -
您在这段代码中读取和写入相同的 tfile。我怀疑 eof 在第一次写入后设置为 true,这意味着 bflag 在第 3 行设置为 true。告诉我我错了。
-
@nolaspeaker 这应该不是问题,因为 OP 正在写入循环之外的文件,他正在检查用户名是否已经存在。此时代码应该已经遍历了整个文件。
-
您不应该期望读者尝试猜测您的其他代码在做什么,而是提供minimal, reproducible example。
-
您可以简化代码以检查用户名是否已存在。如何?您可以轻松拨打
if Pos(Username+'#',sline) = 1 then //Username already exists。这将如何工作?好吧,如果Pos函数返回字符串中子字符串的位置。如果搜索到的子字符串位于字符串的开头,则将返回 1 作为结果。如果在行的中间找到它(也许有人使用某个名称作为密码,那么返回的位置将大于 1,因此不匹配用户名。如果在字符串中的任何位置都找不到子字符串,则函数将返回0.
标签: delphi text-files pascal