2013-02-24 68 views
2

從文件計數的單詞和字符數我寫了下面的代碼來打印文件的內容,並從文件錯誤在Java中

import java.io.*; 
import java.util.*; 

class Ass53 
{ 


public static void main(String args[]) throws Exception 
{ 
    File file=new File("sample.txt"); 
    Scanner sc=new Scanner(new FileInputStream(file)); 
    String line,line1; 
    int count1=0; 
    int count=0;   

    /*Loop for printing contents of file*/ 
    while(sc.hasNextLine()) 
    { 
     line=sc.nextLine(); 
     System.out.println(line); 
    } 


    /*loop for counting number of character in file*/ 
    while(sc.hasNext()) 
    { 
      line1=sc.next(); 
     for(int i=1;i<=line1.length();i++) 
      count1++; 
    } 
    System.out.println(count1); 


    /*loop for counting number of words in a file*/ 
    while(sc.hasNext()) 
    { 
      sc.next(); 
      count++; 
    } 
    System.out.println("Number of words: " + count); 


    } 


} 

問題打印字符和文字的數量是隻有也先循環正在執行。我猜想原因可能是sc.nextLine for first while while循環。第一次while循環sc指向沒有我猜測?

有什麼方法可以解決它嗎? 我希望我的其他while循環也可以工作

回答

1

第一個循環說「直到我用完文件中的行,讀取並打印它」。然後第二個循環查找文件中的更多字符,當然沒有任何內容。

一種選擇是在每次循環之前重置掃描儀。在第一次之後的每個循環之前,關閉並丟棄掃描儀,然後創建一個新的掃描儀。

雖然有更好的方法。您可以逐字符遍歷文件(例如使用BufferedReader),並在每個字符上增加字符數,並在每個換行符上換行。不要忘記考慮不以換行符結尾的文件。只需要一個循環,並且您已經計算了總字符數和行數。

+0

OK亞當日Thnx我得到了我的錯誤 – Amol 2013-02-24 18:37:36

1

您需要將sc設置迴流的開始,每次循環完成後。

我不會發布的代碼,因爲這看起來像功課,我猜的類名Ass53是「Assignment53」。查找並找出如何將流設置回開始不應太難。

諸位可以嘗試這種合併成一個圈,因爲它現在代表,實際上是讀同一文件的3倍。如果它是一個小文件,它可能並不那麼糟糕,但如果它是一個較大的文件,速度會很慢。

+0

好的男人,我得到了日Thnx – Amol 2013-02-24 18:36:01

2

每當你在做nextLine()你正在推進掃描儀超過當前行。當第一個循環結束時,您位於文件的末尾,沒有任何可掃描的內容。

解決方案是在每個循環之前重新創建掃描儀。之前第二和第三while只要重複這一點:

sc=new Scanner(new FileInputStream(file)); 

另一種解決方案將涉及更多的工作,但更優雅:使用一個循環來的所有行存儲在List<String>,然後分析所有行數字和字符。

+0

約sc.reset()這是什麼方法做什麼? – Azad 2013-02-24 18:44:31

+1

'reset()'方法不會將掃描器放到文件的開頭。人們必須明白,底層的InputStream已經被使用了,並且不能返回。此方法僅重置掃描儀對象的某些配置選項。請參閱[javadoc](http://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#reset()) – 2013-02-24 19:02:58

+0

謝謝,我寧願使用列表不讀取文件三次或更多時間。 – Azad 2013-02-24 19:05:39