2012-01-25 6 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

すべてのメソッドでScannerオブジェクトを作成しないでください。あなたが作成した最初のScannerオブジェクトを渡します。

--- 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

私はScannerが内部的にバッファを管理する方法と関係があると考えています。私は入力全体をワンショットでコピーしてコピーすると、実際にキーボードによる入力は私のためには機能しません。私は入力を1つずつ入力するだけで動作します。おそらく、入力全体をワンショットで作成すると、最初に作成したScannerオブジェクトはバッファ内の入力全体を取得し、次に2つのScannerオブジェクトは空のバッファを取得します。 –

+0

@SusamPal - あなたが正しいと思います。それは異なる行動を説明するでしょう。 –

1

なぜ3つのスキャナを作成していますか?それだけで1 INTとの入力をライン1に読み出されていると、行2はnextIntを(スキャンしようとしているので、それはライン

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

で窒息されていることが可能です)を空行として使用します。

入力が別の順序でない限り、手で入力するときにこれがなぜ機能するのかわかりません。

+0

私は理解していないのと同じ理由:ここで

は問題を修正すべき変更点の一覧です。注文がまったく同じときにキーボードから入力すると、うまく動作するのはなぜですか? –

0

入力をリダイレクトするのに、<を使用しないでください。ファイルから読み込むにはスキャナクラスを使用する必要があります。

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

'<'を使用して入力をリダイレクトする場合は何も問題ありません。リダイレクトとパイプ処理は、stdinから読み込むプログラムに入力を与える一般的な方法です。 Scanner(System.in)オブジェクトは、標準入力で入力を取得する限り、入力がキーボード、リダイレクト、またはパイプから来るかどうかは考慮しません。 –

関連する問題