Java: чтение текстового файла и сохранение информации в массиве с помощью класса сканера - PullRequest
3 голосов
/ 14 марта 2010

У меня есть текстовый файл, включающий оценки учеников, такие как:

Kim $ 40 $ 45
Jack $ 35 $ 40

Я пытаюсь прочитать эти данные из текстового файла и сохранить информацию в списке массивов, используя класс сканера. Может ли кто-нибудь посоветовать мне правильно написать код?

код

import java.io.*;
import java.util.*;

public class ReadStudentsGrade {

public static void main(String[] args) throws IOException {

    ArrayList stuRec = new ArrayList();
    File file = new File("c:\\StudentGrade.txt");
    try {
        Scanner scanner = new Scanner(file).useDelimiter("$");

        while (scanner.hasNextLine())
        {
            String stuName = scanner.nextLine();
            int midTirmGrade = scanner.nextInt();
            int finalGrade = scanner.nextInt();
            System.out.println(stuName + " " + midTirmGrade + " " + finalGrade);
        }
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
}

Ошибка выполнения:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:840)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextInt(Scanner.java:2091)
    at java.util.Scanner.nextInt(Scanner.java:2050)
    at writereadstudentsgrade.ReadStudentsGrade.main(ReadStudentsGrade.java:26)

Ответы [ 2 ]

2 голосов
/ 14 марта 2010

Попробуйте useDelimiter(" \\$ |[\\r\\n]+");

        String stuName = scanner.next(); // not nextLine()!
        int midTirmGrade = scanner.nextInt();
        int finalGrade = scanner.nextInt();

Ваши проблемы были таковы:

  • Вы по ошибке прочитали всю строку , чтобы получить имя студента
  • $ - метасимвол регулярного выражения, который необходимо экранировать
  • Вам необходимо указать как разделители строк, так и разделители полей
0 голосов
/ 14 марта 2010

Ваша while петля выключена.

nextLine() вернет вам все, что осталось от строки, и переместит курсор туда. nextInt() будет затем переходить через разделители, пока не найдет int. Результатом будет пропуск значений.
Предполагая, что Ким и Джек были на разных линиях, вы получите:

stuName == "Kim $ 40 $ 45"
midTirmGrade == 35
finalGrade == 40

как ваш вывод; что не то, что вы хотите.

Либо вам нужно использовать конец строки в качестве разделителя, либо использовать StringTokenizer , чтобы разбить каждую строку и затем проанализировать каждую из секций как отдельные токены.

...