views:

1281

answers:

2

Hi,

I have a text file include Student Grades like

Kim $ 40 $ 45

Jack $ 35 $ 40

I'm trying to read this data from the text file and store the information into an array list using Scanner Class

could any one guied me to write the code correctly ?

Here is what I have so far

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();
    }
}

here is ther output error

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)

Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)

+1  A: 

Try useDelimiter(" \\$ |[\\r\\n]+");

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

Your problems were that:

  • You mistakenly read whole line to get student name
  • $ is a regex metacharacter that needs to be escaped
  • You need to provide both line delimiters and field delimiters
polygenelubricants
The crucial part is probably the scanner.next() call...
extraneon
The delimiter is also crucial.
polygenelubricants
A: 

Your while loop is off.

nextLine() will get you all what's left of the line and advance the cursor to there. nextInt() will then jump delimiters until it finds an int. The result will be skipping of values.
Assuming Kim and Jack were on different lines you would get:

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

as your output; which isn't what you want.

Either you need to use the end-of-line as the delimiter or use a StringTokenizer to break each line up and then parse each of the sections as individual tokens.

Smalltown2000