2017-05-04 1 views
0

학생 기록 (이름, 성 및 학년)이있는 파일을 읽으려고합니다. 이 작업을 수행하는 간단한 코드를 작성했지만 텍스트 파일에서 두 줄을 읽은 후 코드가 실패합니다. 여기 내 코드입니다 :파일에서 학생 기록을 읽는 중

public class Student { 
private final String first,last; 
final int MAXGRADE = 100; 
final int LOWGRADE = 0; 
private final int grade; 

public Student(String firstname,String lastname, int grade){ 
    this.first = firstname; 
    this.last = lastname; 
    this.grade = grade; 

} 
@Override 
public String toString(){ 
    return first + " " + last + "\t" + grade; 
} 
} 

및 드라이버는 컴파일러가 오류의 원인으로이

grade = fileInput.nextInt(); 

가리키는 코드를

public class driver { 
public static void main(String[] args) throws FileNotFoundException { 
    String first_name ,last_name; 
    int grade; 
    Scanner fileInput = new Scanner(new File("data1.txt")); 
    while (fileInput.hasNextLine()) 
    { 
     first_name = fileInput.next(); 
     last_name = fileInput.next(); 
     grade = fileInput.nextInt(); 

     Student st = new Student(first_name, last_name,grade); 

     System.out.println(st); 

    } 
} 
} 

있습니다.

+1

무엇이 오류입니까? – Sajjad

+0

이것은 스캐너를 사용하는 방법이 아닙니다. 'nextXXX' 메소드는 다음 구분자 (' "\ n"')가 될 때까지 전체 String을 가져 와서 해석합니다. 그래서 당신의 의지 루프에서 실제로 한 학생에게 3 줄을 가져 가야합니다. – AxelH

+0

이상적으로, 전체 오류 스택을 볼 수 있도록 'try catch'블록에 실행 코드를 래핑해야합니다. – user75ponic

답변

0

사용하는 경우 자바 8 이 일을 다음 기능 방법은 다음과 같습니다

String filePath = "C:/downloads/stud_records.txt"; // your file path 
     /* 
     * Gives you a list of all students form the file 
     */ 
     List<Student> allStudentsFromFile = Files.lines(Paths.get(filePath)).map(line -> { 
      String[] data = line.split("\\s+"); //Split on your delimiter 
      Student stud = new Student(data[0], data[1], Integer.parseInt(data[2])); 
      return stud; 
     }).collect(Collectors.toList()); 

: 나는 가정을했습니다 이 있음 :

이름 성 등급

하는 입력 파일 포맷이다.

0

게시 한 댓글에서 "@AxelH 각 줄은 한 학생의 이름, 성 및 학년을 나타냅니다." 우리는 문제를 볼 수 있습니다.

귀하의 실제 루프는

while (fileInput.hasNextLine()) 
{ 
    first_name = fileInput.next(); 
    last_name = fileInput.next(); 
    grade = fileInput.nextInt(); 

    Student st = new Student(first_name, last_name,grade); 

    System.out.println(st); 

} 

3 선, fileInput.nextXXX(); 당을 읽고 라인을 읽을 수 있습니다. 당신이해야 할 것은

  • String로 라인을 읽어 : = fileInput.nextLine()`문자열 라인;
  • 구분 기호에 해당 줄을 나눕니다.`String [] data = line.split (""); // 또는
  • 이 배열의 값 설정 (... 어떤 이름을 가진 자르)하지 공간 (구문 분석 정수에 필요한되는) 경우 구분

편집 : 내가 실수를 한

나는 nextline을 사용하고 있는데 next이 아닌 것을 사용했기 때문에 답변을 수락 할 때 삭제할 수 없으므로 내용을 변경하지 않고 더 정확한 내용으로 업데이트 할 것입니다.

코드

은 참으로 정확 next 다음 구분 기호 \\p{}javaWhitespace}+ 때까지 다음 입력을하지만, 주어진 솔루션을 사용하여 당신이 Katrina Del Rio 3이 될 수로 작성된 이름을 관리 할 수있는 많은 솔루션을 제공한다.

1

이 코드는 나를 위해 작동합니다.확인

  1. 올바르게 지정된 텍스트 파일의 위치,
  2. 정수의 각 라인에서 3 번째 위치에서 주어진 값 (같은 : - 스티브 스미스 22)는
+0

주어진 코드가 완벽합니다. 파일에서 예상대로 읽으면 공백 (문자열과 정수)으로 자동 구분됩니다. 한 가지는 텍스트 파일을 올바른 형식으로 제공해야한다는 것입니다. – Manu

+0

당신이 옳다. 그가 읽었을 때와 파싱을하기 전에 예외가 있기 때문에 파일에 관한 것이 아니다. – AxelH

관련 문제