4

正確にどのように機能するかについての詳細を見つけるのに苦労System.in.read();しています。誰かが私を助けてくれるかもしれません。スキャナーの方が望ましいようですが、私はそれを使用することを許可されていません。

コンソールのユーザー入力を Boolean-Operator-Boolean の形式で読み取り、T^F や T&T などの形式で読み取りSystem.in.read()、ステートメントが返すものを単純に出力するという割り当てが与えられました。

通常の人はおそらく別の方法を使用するでしょうが、割り当てには、 と のみが許可されていることが明確に記載System.in.read()System.out.println()れています。

それを解決するための私の試みは次のとおりです。

import java.io.*;

public static void main(String[] args) {

  String error = "Reading error, please use T or F";

  boolean a = true;  //char: 84 or 116 for T and t
  boolean b = false; //char: 70 or 102 for F and f
  int userChar1;
  int userOperator;
  int userChar2;
  int chosenOperator = 0;

  try {

    //Get first char
    System.out.println("Enter the first value (T or F):");
    userChar1 = System.in.read();

    if((userChar1==84)||(userChar1==116)) { // T or t
      a = true;
    } else if ((userChar1==70)||(userChar1==102)) { // F or f
      a = false;
    } else {
      System.out.println(error);
    }


    //Get second char
    System.out.println("Select an operator:  &  |  ^");
    userOperator = System.in.read();

    if(userOperator==38) { // &
      chosenOperator = 0;
    } else if (userOperator==124) { // |
      chosenOperator = 1;
    } else if (userOperator==94) { // ^
      chosenOperator = 2;
    } else {
      System.out.println(error);
    }


    //Get third char 
    System.out.println("Enter the second value:");
    userChar2 = System.in.read();
    System.in.close();
    if((userChar2==84)||(userChar2==116)) {
      b = true;
    } else if ((userChar2==70)||(userChar2==102)) {
      b = false;
    } else {
      System.out.println(error);
    }


    //Figure out result
    boolean result;
    switch (chosenOperator) {
    case 0:
      result = a&b;   
    case 1:
      result = a|b;
    case 2:
      result = a^b;

      System.out.println(result);

    }

  } catch(IOException e) {

  }
}

このコードを実行すると、コンソールは最初のユーザー入力の後にユーザー入力を待機しSystem.in.read()、char 入力を正しくチェックします。ただし、その後はすべてSystem.in.read()無視され、プログラムは終了します。

を使用するコードを見つけたSystem.in.close()ので、どのメソッドが正確に何をしているのかまだわからないので、毎回System.in.read(). System.in.read()これにより、 a の後の最初のSystem.in.close()が呼び出されたときにプログラムが終了します。

それで、正確に何が起こっているのですか?System.in.read()正しい使い方は?

4

3 に答える 3

4

問題は System.in.read() ではなく、コンソールにあります。コンソールは通常バッファリングされます。つまり、データはエンター キーが押された後にのみプログラムに送信されます (つまり、System.in.read() で読み取り可能になります)。そのため、コンソールを非バッファ モードに切り替える必要がありますが、コンソールには非常に多くの種類 (UNIX シェル、コマンド ウィンドウ、Eclipse コンソールなど) があるため、これを行う移植可能な方法はありません。
System.in.read() および System.out.println() メソッド以外の使用が許可されていない場合は、ユーザーに完全な用語を 1 行に入力させ、Enter キーを押してから文字を処理できるようにする必要があります。入力した例:

public static void main(String[] args) throws IOException {
    boolean a = true; // char: 84 or 116 for T and t
    boolean b = false; // char: 70 or 102 for F and f
    int userChar1;
    int userOperator;
    int userChar2;

    System.out.println("Please enter the term, e.g. T&F:");

    userChar1 = System.in.read();
    userOperator = System.in.read();
    userChar2 = System.in.read();

    a = userChar1 == 'T' || userChar1 == 't';
    b = userChar2 == 'T' || userChar1 == 't';

    switch (userOperator) {
    case '&':
        System.out.println(a & b);break;
    case '|':
        System.out.println(a | b);break;
    case '^':
        System.out.println(a ^ b);break;
    default:
        System.out.println("unknow operator");
    }
}
于 2012-10-28T16:05:33.737 に答える
1

個人的にはあなたのコードを実行するのに問題はありませんでしたが、いくつかの奇妙な影響があり、調査する必要がありました.

このアプローチ(を使用System.in.read())の主な問題は、ユーザーが文字を入力するときに押すenter必要があるため、予想される1文字ではなく2文字になることです-ユーザーが入力した最初の文字(TまたはFを想定しましょうcase) と改行文字。

マイナーな変更を加えて、コードを機能させることができました。read()メソッドのオーバーロード バージョンを呼び出す必要がread(byte[] b)ありますsome number of bytes from the input stream and stores them into the buffer array

変更されたコードの最初の部分は次のとおりです。

byte[] input = new byte[10];
System.out.println("Enter the first value (T or F):");
System.in.read(input);
userChar1 = input[0];
if ((userChar1 == 84) || (userChar1 == 116)) { // T or t
    a = true;
} else if ((userChar1 == 70) || (userChar1 == 102)) { // F or f
    a = false;
} else {
    System.out.println(error);
}

何を返すかは気にしないことに注意してください。配列read()からの最初の文字のみを気にします。input残りのコードは同じ方法で変更されます。同じバッファ配列 ( input) を使用して、0 番目の要素をクエリすることもできます。

于 2012-10-28T15:50:31.040 に答える
1

コードの次の部分を見てください。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String input = null;

//  read the input from the command-line; need to use try/catch with the
//  readLine() method
try {
input = br.readLine();
} catch (IOException e) {
      System.out.println("IO error trying to read your input!");
      System.exit(1);
}
System.out.println("your input: "+input);

bufferReader の使用が許可されていない場合は、bufferReader のソース コードを確認することをお勧めします。

于 2012-10-28T15:19:34.283 に答える