2012-01-25 2 views
2

Вот мой код:Ошибка при перенаправлении ввода из файла

import java.util.Scanner; 

class Graph{ 
boolean [][]array; 
int N; 
Graph(){ 
    array = new boolean [1001][1001]; 
    N=0; 
} 

void read_graph() { 
    Scanner sc = new Scanner(System.in); 
    N = sc.nextInt(); 
    sc.nextLine(); 

    String str; 
    String []substr; 

    for (int K=1; K<=N; K++){ 
     str = sc.nextLine(); 
     substr = str.split(" "); 
     for (int I=0; I<substr.length; I++) 
      System.out.println(substr[0]+" "+substr[I]); 
    } 
} 

void query(){ 
Scanner sc = new Scanner(System.in); 
    int P, Q; 
    int counter = 0; 
    boolean flag = true; 
    while (flag){ 
    counter++; 
    P = sc.nextInt(); 
    Q = sc.nextInt(); 
    sc.nextLine(); 
    if (P == Q && P == 0) 
     flag =false; 
    else { 
     if (Q == 1) 
      System.out.println("DFS done"); 
     else 
      System.out.println("Bfs done");  
        } 
    } 
    }  
} 
class demo{ 
public static void main(String [] args){ 
    Graph G= new Graph(); 
    Scanner sc = new Scanner(System.in); 
    int numGraphs = sc.nextInt(); 
    while (numGraphs>0){ 
     G.read_graph(); 
     G.query(); 
     numGraphs--; 
     } 
    } 
} 

Вот Входные данные:

1 
6 
1 2 3 4 
2 2 3 6 
3 2 1 2 
4 1 1 
5 0 
6 1 2 
5 1 
1 0 
1 0 
0 0 

Когда я даю это входные данные с клавиатуры она работает нормально, но когда я сохранил этот вход для файла и перенаправить это как вход (в linux с использованием '<'), он выдает сообщение об ошибке.

Exception in thread "main" java.util.NoSuchElementException 
at java.util.Scanner.throwFor(Scanner.java:855) 
at java.util.Scanner.next(Scanner.java:1478) 
at java.util.Scanner.nextInt(Scanner.java:2108) 
at java.util.Scanner.nextInt(Scanner.java:2067) 
at Graph.read_graph(b.java:13) 
at demo.main(b.java:56) 

Помогите мне в указании ошибки.

ответ

4

Не создавайте объект сканера в каждом методе. Передайте первый объект сканера, который вы создали.

Вот список изменений, которые должны исправить проблему:

--- demo-old.java 2012-01-25 23:12:54.000000000 +0530 
+++ demo.java 2012-01-25 23:13:45.000000000 +0530 
@@ -10,4 +10,3 @@ 

-void read_graph() { 
- Scanner sc = new Scanner(System.in); 
+void read_graph(Scanner sc) { 
    N = sc.nextInt(); 
@@ -26,4 +25,3 @@ 

-void query(){ 
-Scanner sc = new Scanner(System.in); 
+void query(Scanner sc){ 
    int P, Q; 
@@ -53,4 +51,4 @@ 
    while (numGraphs>0){ 
-  G.read_graph(); 
-  G.query(); 
+  G.read_graph(sc); 
+  G.query(sc); 
     numGraphs--; 
+0

спасибо, трюк работал, но я до сих пор не понял, почему перенаправление ввода из файла не сработало, но ввод с клавиатуры прекрасен? –

+0

Я считаю, что это имеет какое-то отношение к тому, как сканер поддерживает буфер внутри. На самом деле ввод с клавиатуры не работает для меня, когда я копирую весь вход в один снимок. Он работает только для меня, если я набираю вход один за другим. Возможно, когда вы делаете весь ввод одним выстрелом, первый созданный вами объект сканера получает весь вход в свой буфер, а затем два других объекта сканера получают пустые буферы. –

+0

@SusamPal - Я думаю, вы правы. что объясняет различное поведение. –

1

Почему вы создаете 3 сканера? Вполне возможно, что он задыхается в линиях

1) P = sc.nextInt();
2) Q = sc.nextInt();

, потому что вход только с 1 междунар считывается в строке 1, а затем линия 2 пытается сканировать nextInt () для пустой строки.

Я понятия не имею, почему это будет работать при вводе вручную, если вход не в другом порядке.

+0

по той же причине я не понимаю. Почему он работает нормально, когда я вводил клавиатуру, а порядок точно такой же. –

0

Вы не должны использовать < для перенаправления ввода. Вы должны использовать класс сканера для чтения из файла.

File file = new File("data.txt"); 
Scanner scanner = new Scanner(file); 
while (scanner.hasNextLine()) { 
//logic 
} 
+1

Нет ничего плохого в использовании '<' для перенаправления ввода. Перенаправление и трубопроводы являются распространенными способами предоставления ввода в программу, которая читает из stdin. Объекту Scanner (System.in) все равно, поступает ли вход с клавиатуры, перенаправления или трубопровода, пока он получает вход на стандартном входе. –