2014-09-05 67 views
-1

問題URL:http://www.spoj.com/problems/PT07H/如何讀取輸入,直到Java的EOF爲SPOJ上的此程序?

順便說,我試圖通過3種不同的方法,但沒有成功讀取的輸入時,控制從不出來而()循環(即,它從不檢測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); 
       } 
      } 
     } 

} 

回答

1

標準輸入實際沒有EOF,所以你永遠不會看到它。從實際文件(或其他流)中讀取結束時,您的方法#3將工作。

(你可能想嘗試 '型' 的標準輸入(按Ctrl-d或Ctrl-Z),這可能會或可能無法正常工作,不知道。一個EOF)

又見this問題。

+0

按Ctrl + Z正常工作時,我在Eclipse中運行這個程序,但我不知道SPOJ環境。 – 2014-09-05 10:25:22

+0

鑑於問題描述中可能輸入的定義,您並不需要「EOF」。只要讀取第二個XML文檔的結束標記,輸入即完成。 – JimmyB 2014-09-05 10:48:08

2

使用CTRL + d和Ctrl + Z是一個很好的,但是如果標準輸入中需要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文件結束。