我正在编写一个程序,要求用户登录并检查他们的ID是否在文件中" Employees.txt"如果是,那么如果他们是经理或助理,它将打印出VALID __ ID。但是当我输入一个无效的ID时,请说" x" in然后再试一次,它会永远循环,而不是检查ID是否有效。我该如何解决这个问题?我在与Account.java和
相同的目录中有Employees.txtdef digitCount(n):
if len(str(n)) == 1:
return 1
else:
return 1 + digitCount(str(n)[1:])
是文件里面的内容。任何帮助都会受到赞赏,因为我已尽力而为。感谢。
E12,Manager
E13,Assistant
答案 0 :(得分:2)
当您输入ID时,您开始循环文件以查看该ID是否匹配。
您到达文件的末尾。 readEmployeesFile.hasNextLine()
是假的。所以你再次迭代,阅读下一个ID。
但是readEmployeesFile
仍然在文件的末尾。没有什么可以把它带回到开头。因此,当它再次转到while
时,readEmployeesFile.hasNextLine()
仍然为假。
可能的解决方案:
readEmployeesFile
,而不是在方法的开头,而是在使用之前。然后在到达文件末尾后立即关闭它。因此,每次用户输入ID时,您都会打开和关闭它。Map
,然后在该地图中而不是直接在文件中查找ID。这会更有效率。答案 1 :(得分:1)
问题是您在循环内打开Scanner
,强制它在第一次迭代时读取文件的所有内容。这意味着while(readEmployeesFile.hasNextLine())
中的条件在第一次迭代后将始终计算为false
,并且永远不会再次输入循环。因此,只有第一次试验可能有效,之后您的循环无法终止。
以下是适合我的调整代码:
import java.io.*;
import java.util.*;
public class Account
{
public static String accountInput;
public static boolean inSystem = true;
public static boolean displayLogIn = true;
public static Scanner userInput = new Scanner(System.in);
public static File employeesFile = new File("Employees.txt");
public static void main(String[] args) throws IOException
{
List<String[]> contents = new ArrayList<>();
System.out.println("\tWorking Files");
System.out.println("-------------------------------------------");
System.out.println("Stock File:\t\tStock.txt\nEmployee File:\t\tEmployees.txt\nTransactions File:\tTransactions.txt\n\n");
Scanner readEmployeesFile = new Scanner(employeesFile);
while(readEmployeesFile.hasNextLine()) {
String[] current = readEmployeesFile.nextLine().split(",");
contents.add(current);
}
while(inSystem)
{
while(displayLogIn)
{
System.out.print("Enter Employee ID(i.e E1)\tEnter Q to Quit Program.\nEnter here: ");
accountInput = userInput.nextLine();
for(String[] content: contents) {
if (content[0].equals(accountInput) & content[1].equals("Manager")) {
displayLogIn = false;
System.out.print("Valid MGR ID");
inSystem = false;
} else if (content[0].equals(accountInput) & content[1].equals("Assistant")) {
displayLogIn = false;
System.out.print("Valid AST ID");
inSystem = false;
} else if (accountInput.equals("Q")) {
displayLogIn = false;
inSystem = false;
}
}
}
}
readEmployeesFile.close();
}
}
正如您所看到的,输入文件在之前读取一次进入循环并存储contents
中现在为List<String[]>
类型的所有行。在for
循环中,您只需要检查已经读取的文件的内容。
另外,您应该始终关闭正在使用的资源。在这种情况下,我引用Scanner
对象,这就是我在循环后包含行readEmployeesFile.close();
的原因。
答案 2 :(得分:0)
更改
contents[0].equals(accountInput) & contents[1].equals("Manager")
contents[0].equals(accountInput) & contents[1].equals("Assistant")
到
contents[0].equals(accountInput) && contents[1].equals("Manager")
contents[0].equals(accountInput) && contents[1].equals("Assistant")
AND 运算符用双符号(&amp;&amp;)表示,而不是一个。