如何在SPOJ上为此程序读取Java中的EOF输入?

时间:2014-09-05 10:01:50

标签: java algorithm

问题网址:http://www.spoj.com/problems/PT07H/

顺便说一句,我尝试通过3种不同的方法读取输入但没有成功,控制永远不会出现while()循环(即,它从不检测EOF或EOS)。

这是我的代码,它读取输入XML:

public static void main(String[] args) throws Exception {

        // Input & Output
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        OutputStream out = new BufferedOutputStream(System.out);

        int data;
        char c;
        String line;
        StringBuilder xml = new StringBuilder();

        // Read input
/*
        // Method-1
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            line = in.nextLine();
            for (int i = 0; i < line.length(); i++) {
                c = line.charAt(i);
                if (isValid(c)) {
                    xml.append(c);
                }
            }
        }
        // Method-2
        while ((data = br.read()) != -1) {
            c = (char) data;
            if (isValid(c)) {
                xml.append(c);
            }
        }
*/
        // Method-3
        while ((line = br.readLine()) != null) {
            for (int i = 0; i < line.length(); i++) {
                c = line.charAt(i);
                if (isValid(c)) {
                    xml.append(c);
                }
            }
        }

}

2 个答案:

答案 0 :(得分:2)

使用Ctrl + D和Ctrl + Z是一个很好的,但如果你需要在stdin中使用EOF,我们可以将EOF实现为分隔符。

        Scanner sin = new Scanner(System.in);
        CharSequence end1 = "end-of-file";
        CharSequence end2 = "EOF";
        CharSequence end3 = "End Of File";
        ArrayList<String> Arr = new ArrayList<String>();
        int i =0;

        while(sin.hasNext())
        {
            Arr.add(sin.nextLine());
                              //If the input string contains end-of-file or EOF or End Of File. 
            if( (Arr.get(i).contains(end1)) == true || (Arr.get(i).contains(end2)) == true || (Arr.get(i).contains(end3) ) == true )
            {
                i++;
                break;
            }
            i++;
        }

希望它可以帮助某人寻找stdin文件结束。

答案 1 :(得分:1)

标准输入 没有EOF,所以你永远不会看到它。当从具有结束的实际文件(或其他流)中读取时,您的方法#3将起作用。

(您可能想尝试在stdin上键入'EOF(Ctrl-D或Ctrl-Z),这可能会也可能不会,但不确定。)

另见this问题。