2

以下のコードは、ファイル「helpFile.txt」から読み取り、「#」で表されるインデックスをチェックします。ファイルから読み取られた変数は整数 c に格納され、読み取られた文字が '#' の場合、整数を文字にキャストせずに '#' と比較されます。コンパイラがエラーを表示していないため、比較が有効かどうかを知りたいです。また、'#' がファイル内のプログラムによって検出され、'topic' と呼ばれる文字列が '#' の直後に続き、readLine() を使用して読み取られるとします。「String info = br.readLine()」は単に「topic」または「#」+「topic」になりますか? このような長い質問で申し訳ありません。大変助かりました。

boolean helpOn(String what){

    private BufferedReader br;
    private String info, topic;
    private static PrintWriter pw = new PrintWriter(System.out, true);
    int c;


        br = new BufferedReader(new FileReader("helpFile.txt"));

    try{
        do{
            //read characters until '#' is found
            c = br.read();


            if(***c=='#'***){   //check if the character is '#'
                pw.println(c);
                if((**topic=br.readLine()**).equalsIgnoreCase(what)){   //check if 'what' string is equal to 's' which is the string after '#'
                    while((info=br.readLine())!=null){  //print info until the end of info
                        if(info!=null)
                            pw.println(info);
                    }
                    return true;
                }
            }
        }
        while(c!=-1);
    }
    catch(IOException ex){
        pw.println("File error.");
        ex.printStackTrace();
        try{
            br.close();
        }
        catch(IOException e){
            pw.println("Error closing file.");
            e.printStackTrace();
        }
        return false;
    }

    try{
        br.close();
    }
    catch(IOException ex){
        pw.println("Error closing file.");
        ex.printStackTrace();
    }
    return false; //topic not found
}
4

2 に答える 2

1

私はあなたのコードを試してみましたが、うまくいっています。「helpFile.txt」を確認する必要があると思います。その中でこれを使いました。

adad#こんにちは

元気ですか

そして、これは私が得ているアウトアウトです。

c:35

トピック: こんにちは

info: どういたしまして

uが使用した3つの変数すべてを印刷しました。c、トピック、情報。文字を読み取った後に readline() を使用しているため、「helpFile.txt」の次の行から「情報」を提供する必要があります

readline() 関数を使用しているため、info にはトピックの後に何かが含まれ、次の行に移動します。私の例で試してください。

「#」に遭遇するとすぐに、変数

C には "#" (35) が付きます。

それから

readline(); により、トピックには「#」の後に行末まで何かが含まれます。

それから

info には、トピックの後に次の行があります。

helpFile.txt を適切にフォーマットすると、これは正常に機能します。

編集

毎回完全なファイル名を指定する必要があります

あなたはEclipseを使用しており、ファイルを「SRC」フォルダーに保存しています。それらを Project フォルダーに保存します。SRC フォルダーの 1 つ上に移動してから、これを実行します。

br = new BufferedReader(new FileReader("helpFile.txt"));

それはうまくいくはずです。

EDIT2 null の情報を 2 回確認する必要はありません

while((info=br.readLine())!=null){
//print info until the end of
//  if(info!=null) noT needed, u alreay did that above
pw.println("info"+info);
             }

NULL の場合、自動的にループから抜けます。

EDIT3

すべてのテキストを印刷したくない

# を使用してブロックの開始をマークしたように、ブロックの終わりをマークするために何でも使用できます。例えば

helpFile.txt

adad#こんにちは

元気ですか

$

その他のテキストはこちら

何とか何とか何とか...

...

これで、while を次のように変更できます。

while(!(info=br.readLine()).equals("$")){
      pw.println("info"+info);
                            }

ループは「$」を取得するとすぐに終了し、その後は何も出力しません。

于 2012-04-22T06:21:47.813 に答える
0

使用しているクラス (BufferedReader) の javadoc を読みたいと思うかもしれませんが、ここで見つけることができますが、char は実際には数値型であるため、文字を == と比較しても問題ないと思います。ただし、FileReader はデフォルトのプラットフォーム エンコーディングを使用してファイルを読み取ると思いますが、それはファイル エンコーディングではない可能性があるため、エンコンディングについて詳しく読むことをお勧めします。ファイルのエンコーディングを通知することは常に良い習慣です。2番目の質問については、javadoc(再び)に従って、行全体を読み取ります(文字を読み取った時点からではありません)。お役に立てば幸いです。結果を確認するために、後でこれを実行してみます

于 2012-04-22T06:24:15.360 に答える