2012-05-13 9 views
3

でご利用いただけます。 C++では次のようにして実行できます。キープは、java

int main(){ 
    int val; 
    while(cin >> val){ 
      //do stuff 
    } 
} 

事前にJavaで

感謝を(上記のように)同様のことを行うための方法は何ですか。 シャンタヌ

+0

私はuが求めrは何を正しく理解すれば、「以前に宣言した変数は、コマンドラインを介してユーザによって初期化されるまでループを反復維持する方法??」です右?? – WickeD

答えて

1

あなたは試してみてください次のこと。

long val; 
    Scanner sc = new Scanner(System.in).useDelimiter("\n"); 
    while (sc.hasNext()) { 
     String temp = sc.next().trim(); 

     val = Long.parseLong(temp); 
     // do stuff 
    } 
+0

あなたのコードは以下の例外をスローしています。スレッドの例外java.util.Scanner.nextLongでjava.util.Scanner.throwForで "メイン" java.util.InputMismatchException \t(不明なソース)java.util.Scanner.nextで \t(不明なソース) \t(不明なソース)java.util.Scanner.nextLongで \t(不明なソース) – shantanu

+0

の代わりに、sc.nextLong()あなたが – shem

+0

@shemを読みたいものというnextXXX()を使用する必要があります。私は長い間だけ読むことを試みていた。編集されたソリューションが動作しています(入力を文字列として取り込み、それを長時間変換する)。ありがとう。その場合は – shantanu

0

はあなたの特定の要件に応じて、Scannerクラスのメソッドを使用します。これは、行全体を読み込みます。これは、ほとんどのシステムでユーザーがenterを押す必要があることを意味します。

public static void main(String[] args) 
{ 
    String str=new Scanner(System.in).nextLine(); 
} 
1

1つの方法はスキャナを使用することです。

long val; 
Scanner sc=new Scanner(System.in); 
while (sc.hasNextLong()) { 
    val = sc.nextLong(); 
    // do stuff 
} 

これは、指定したcppコードに相当します。しかし、まさにあなたが求めたものではありません。読み取り文字列に正当な入力がある限り、ループします。

0

ビジーループを実装しないでください。あなたはおそらくストリームを使用することを好むでしょう。データが到着するまでの流れの方法read()がブロックされているので、あなたのコードは、忙しいループせずに簡単なもので、あなたが望むとおりに動作します:

while (in.read() != -1) { 
    // do your stuff 
} 

またはより良いバッファを使用して:

byte[] buf = new buf[MAX_SIZE] 
while (in.read(buf) != -1) { 
    // do your stuff 
} 
+0

アレックス。 **変数で**を初期化してください。私はあなたの最初のループを 'InputStream in = System.in;'で初期化して試して、whileループ内にprintステートメントを挿入しました。私は入力を打つときはいつでも今は3つの時間を印刷しています。 – shantanu

0

私はあなたの目的を果たすための最良の方法は、あるスレッドが、ユーザからの入力を待ち、それが1を受信したとき、他のスレッドに知らせますマルチスレッディングを経由していると信じています。一方、他のスレッドはループを繰り返し続けます。

関連する問題