2014-09-24 57 views
1

所以我寫了一個程序,讀取一個特定的文件並返回每個使用的字符的頻率。這是通過使用單鏈表完成的(不是Java LinkedList,但非常相似)。我想知道的是爲什麼這樣的:FileReader中的方法read()如何在文件中移動?

while(txtFile.read() != -1){ 
      Character letter = (char) txtFile.read(); 
      freqBag.add(Character.toLowerCase(letter)); 
     } 

不工作(它不返回給定字符的正確頻率),爲什麼這樣的:

int c; 
while((c = txtFile.read()) != -1){ 
      Character letter = (char) c; 
      freqBag.add(Character.toLowerCase(letter)); 
     } 

作品。我寫了第一篇,一位朋友幫我修復了它。

+1

它們都不起作用。他們都只處理偶數字符。 – EJP 2014-09-24 21:30:49

回答

3

它不起作用,因爲你丟棄了字符。每個read()函數都會帶回下一個字節(作爲帶符號的int),所以您的代碼將會丟棄每個偶數字符(0,2,4 ...)。

while(txtFile.read() != -1){  // Read and discard a character 
    Character letter = (char) txtFile.read(); // Read a character into letter 
    reqBag.add(Character.toLowerCase(letter)); // Store this letter 
} 

你的朋友的代碼不應該工作之一:

int c;   // variable outside the loop 
while((c = txtFile.read()) != -1){ // Read a character into c, compare to -1 
    Character letter = (char) txtFile.read(); // Read another character 
    freqBag.add(Character.toLowerCase(letter)); // Store this letter 
} 

正確的方法是隻讀取一次:

int c; 
while((c = txtFile.read()) != -1) { 
    freqBag.add(Character.toLowerCase((char)c)); 
} 

我懷疑要麼你有一個錯字,或你使用了一個不同的文件,並沒有意識到信件仍然被丟棄。

+0

哦,是的,這是一個錯字。它在字符= =(char)c;時起作用。感謝您的解釋! – 2014-09-24 22:11:45

0

首先你需要記住,當你調用read方法時,你已經從文件中讀取了一個字節,所以如果你在你的while語句中做了一個字節,你會失去一個字節。

第二件事是對我來說(考慮到運算符優先級),這兩段代碼完全相同,所以問題可能出現在代碼的其他部分。