2013-02-24 4 views
0

Я пишу программу, которая будет вводить ввод из текстового файла, заполненного классами учащихся. Эти оценки усредняются и добавляются в список массивов. Однако у меня проблемы с чтением файла. Я получаю несоответствие ввода. Я попытался изменить цикл в методе calcAssignmentAverage до менее 15 (в текстовом файле 15 классов, 2-я строка в текстовом файле), но он все еще дает несоответствие ввода.Ошибка ввода ввода Java из текстового файла

файла (реальный файл имеет 16 студентов в следующем формате.):

Puckett, Karen 
10 10 9.5 10 10 8 9.5 10 10 10 9 10 10 10 0 
4 3 5 3 5 2 3 2 1.5 1 5 3.5 
17.5 24 22 23.5 22 23 
90 91 
96 

Код:

public static void main(String[] args) throws IOException { 
    final double NUM_OF_LABS = 15; 
    final double NUM_OF_QUIZZES = 12; 
    final double NUM_OF_PROJECTS = 6; 
    final double NUM_OF_EXAMS = 2; 
    final double NUM_OF_FINAL = 1; 
    final double LAB_POINTS = 150; 
    final double QUIZ_POINTS = 60; 
    final double PROJECT_POINTS = 150; 
    final double EXAM_POINTS = 200; 
    final double FINAL_POINTS = 100; 

    //Open input file 
    File myFile = new File("scores.txt"); 
    if (!myFile.exists()) { 
     System.out.println("The input file was not found."); 
     System.exit(0); 
    } 

    Scanner inputFile = new Scanner(myFile); 

    ArrayList<Student> studentList = new ArrayList<Student>(); 

    readFile(inputFile, studentList, NUM_OF_LABS, LAB_POINTS, NUM_OF_QUIZZES, 
      QUIZ_POINTS, NUM_OF_PROJECTS, PROJECT_POINTS, NUM_OF_EXAMS, 
      EXAM_POINTS, NUM_OF_FINAL, FINAL_POINTS); 

} 

public static void readFile(Scanner inputFile, 
     ArrayList<Student> studentList, double NUM_OF_LABS, 
     double LAB_POINTS, double NUM_OF_QUIZZES, double QUIZ_POINTS, 
     double NUM_OF_PROJECTS, double PROJECT_POINTS, 
     double NUM_OF_EXAMS, double EXAM_POINTS, double NUM_OF_FINAL, 
     double FINAL_POINTS) { 

    //read and set data for student1: 
    while (inputFile.hasNext()) { 
     //create a new student 
     Student currentStudent = new Student(); 

     //read name 
     String name; 
     name = inputFile.nextLine(); 
     currentStudent.setName(name); 

     //read lab average 
     double labAverage = 0; 
     labAverage = calcAssignmentAverage(NUM_OF_LABS, inputFile, LAB_POINTS); 
     currentStudent.setLabAverage(labAverage); 


     //add currentStudent to the list 
     studentList.add(currentStudent); 


    } 
} 

public static double calcAssignmentAverage(double NUM_ASSIGNMENTS, 
     Scanner inputFile, double MAX_POINTS) { 

    double sum = 0; 
    double average = 0; 

    for (int i = 0; i < NUM_ASSIGNMENTS; i++) { 
     sum = sum + inputFile.nextDouble(); 
    } 
    average = (sum/MAX_POINTS) * 100; 

    return average; 
} 
+1

Ваш код использует класс Student, который не включен – aditsu

+0

Извините, но это уже третий раз, когда вы читаете свой вопрос, но я не знаю, что именно нужно и какова ваша ошибка. уточняйте больше – Azad

+0

Каковы строки (числа) после второй строки в файле образца? В настоящее время вы потребляете только 2-ю строку, но цикл while не будет функционировать должным образом, если он потребляет все строки, так как предполагает, что новый ученик находится в строке 3. – Byron

ответ

0

Байрон прав. Ваша логика перехода к следующему ученику выполняется преждевременно. Вам нужно прочитать строки с 3 по 6, прежде чем перейти к следующей итерации цикла, предполагая, что они применяются к одному и тому же ученику.

Кроме того, после прочтения двойного сканирования сканер автоматически не перейдет к следующей строке. Вам нужно сделать это явно.

+0

Спасибо, что-то в вашем ответе нажал, и я добавил inputFile.nextLine() ; после добавления текущего списка в список. Теперь это работает! – user2105302

Смежные вопросы