【问题标题】:Code is not running through entire text file代码没有在整个文本文件中运行
【发布时间】: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


【解决方案1】:

您没有提供示例文件,但代码在第三行之后停止读取文件的原因只能解释为,您最初在某些使用 CRLF 的文本编辑器中创建了具有三个名称的文件EOL(行尾)字符。

在您的代码中添加新条目时,您只需像在中那样编写 CR (#13)

Write(tfile, #13);

允许的换行符由TTextLineBreakStyle 设置定义。它被声明为:

TTextLineBreakStyle = (tlbsLF, tlbsCRLF);

您正在编写#13 (CR),它本身并不是一个已定义的 EOL 字符。要更正它,您可以改写为#13#10,或使用预定义的常量sLineBreak

另请参阅帮助中的System.SetLineBreakStyle

procedure SetLineBreakStyle(var T: Text; Style: TTextLineBreakStyle);

确定文本文件 I/O 的行尾和文件尾约定。

在 Delphi 中,调用 SetLineBreakStyle 来确定文本文件例程如何查找或标记行尾和文件尾。受影响的例程包括 Read、Write、ReadLn、Writeln、Eof、Eoln、SeekEof 和 SeekEoln。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多