public static Student[] getInput(Scanner scanner)throws FileNotFoundException
{
//change the array size by reading the input file
Student[] classList=new Student[10];
int i;
int numberOfStudents = scanner.nextInt();
while(scanner.hasNext())
{
while(numberOfStudents > classList.length)
{
//enlargeList(classList[i]);
}
for(i = 0; i <= classList.length; i++){
String studentId = scanner.nextLine();
int mark = scanner.nextInt();
classList[i] = new Student(studentId, mark);
}
}
return classList;
}
public static void main(String[] args)
{
if (args.length!=1)
{
System.out.println("Usage GradeManager inputFileName");
System.exit(1);
}
Scanner inFile=null;
try{
//do the whole try block in the lab
String fileName = args[0];
//Open a file with FileName and creaste a scanner using it
inFile = new Scanner(new File(fileName));
Student[] classList=getInput(inFile);
}
catch (FileNotFoundException fe)
{
fe.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}finally{
if(inFile!=null)
inFile.close();
}
}
所以我尝试从文本文件中读取如下:
9
V0012345 98
V0023456 33
V0024615 51
V0089546 57
V0015348 61
V0054162 69
V0044532 87
V0031597 74
V0074615 78
第一行是文本文件中的学生人数,所有其他人都是学生编号+他们在班级中的成绩。我正在尝试将这些导入到数组classList []中。我是java和面向对象的新手,所以如果我的代码是垃圾,我很抱歉。我已经省略了enlargeList方法,因为它有效,我已经测试过了。
由于
答案 0 :(得分:1)
String studentId = scanner.nextLine();
将阅读V0012345 98
然后
int mark = scanner.nextInt();
将阅读V0023456 33
并失败
尝试:
String line = scanner.nextLine();
//this will ignore empty lines
if(line.equals("")) continue;
String[] lineArray = line.split(" ");
String studentId = lineArray[0];
int mark = Integer.parseInt(lineArray[1]);
答案 1 :(得分:0)
我至少有四个问题......
首先,int numberOfStudents = scanner.nextInt();
不会使用新的换行符,这意味着下次您尝试从扫描仪中读取内容时,您可能会获得换行符(如果您正在阅读文本)或例外,您正在读取数值。
尝试在其后添加scanner.nextLine()
,例如......
int numberOfStudents = scanner.nextInt();
scanner.nextLine();
在知道可能的行数之前,您已预先初始化数组。这对我来说似乎很奇怪。你提前知道需要阅读多少行,为什么不使用它?
int numberOfStudents = scanner.nextInt();
scanner.nextLine();
Student[] classList = new Student[numberOfStudents];
接下来,在阅读学生数据时,您似乎正在阅读整行,在它之后寻找int
值...
这意味着您正在使用V0012345 98
阅读scanner.nextLine()
,但下次调用scanner.nextInt()
时会遇到V0023456
,这不是有效int
值。
相反,请阅读下一行并创建一个新的Scanner
来解析它......
Scanner scanLine = new Scanner(line);
String studentId = scanLine.next();
int mark = scanLine.nextInt();
这只是实现此目的的一种可能方法,但我想坚持Scanner
用法只是因为你觉得它很舒服......
现在,在你的复合循环的某个地方,某些东西搞砸了,而Scanner
正在失去同步。
现在,因为我们已经将数组初始化为我们首先读取的头信息,所以我们可以删除复合循环以支持类似...
while (scanner.hasNextLine() && classList.length < i) {
String line = scanner.nextLine();
Scanner scanLine = new Scanner(line);
String studentId = scanLine.next();
int mark = scanLine.nextInt();
scanLine.close();
classList[i] = new Student(studentId, mark);
i++;
}
相反。我已经离开了数组长度检查,以防万一文件在说谎。这意味着标题可以报告它想要的任何值,但循环将检查文件中数据的可用性以及我们有空间阅读它...
这一切都假定您尝试阅读的文件中没有空白行,这与您发布的示例不同。如果有,您需要添加一个签入并跳过这些行