从文本文件中读取并存储到数组中(JAVA)

时间:2014-01-23 23:39:02

标签: java

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方法,因为它有效,我已经测试过了。

由于

2 个答案:

答案 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++;
}

相反。我已经离开了数组长度检查,以防万一文件在说谎。这意味着标题可以报告它想要的任何值,但循环将检查文件中数据的可用性以及我们有空间阅读它...

这一切都假定您尝试阅读的文件中没有空白行,这与您发布的示例不同。如果有,您需要添加一个签入并跳过这些行