2014-10-27 46 views
-1

我必須編寫一個程序來估計一個人爲了贏得獎品而必須喝的飲料的數量,如果有一個五分之一的機會帽將有獎。用戶輸入開瓶測試的次數,並且程序輸出用於贏得獎品的平均瓶數,並且在單獨的文本文件中存儲每次單獨試用贏得的飲品數量。JAVA在輸入I/O作業中的錯誤(初學者)

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Scanner; 
import java.io.File; 

public class BottleCapPrize2 
{ 
public static void main (String[] args) throws IOException 
{ 
    Scanner in = new Scanner (System.in); 
    System.out.print("Number of Trials: "); 
    int trials = in.nextInt(); 
    int trialNumber = 0; 
    int total = 0; 
    int average = 0; 

    for (int x = 0; x < trials; x++){ 
     int counter = 0; 
     double randNum = Math.random(); 
     trialNumber++; 

     while (randNum < 0.8){ 
     counter ++; 
     randNum = Math.random(); 
     } 

    total += counter; 
    average = (int) total/trials; 
    PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt")); 
    outFile.println("Trial " + trialNumber + " took " + counter + " drinks."); 
    outFile.close(); 

    if (trialNumber == trials){ 
    System.out.println("The average was " + average); 

    } 
    }  
} 

輸出到編譯器的程序部分工作正常,但輸出到文本文件(bottleCap.txt)的部分無法正常工作。

當我打開bottleCap.txt時,沿着 「試驗1喝了3杯酒」,「試用2喝了5杯」,......「試驗10喝了9杯酒。」應該寫出來。相反,我只能看到程序最後一次試用的輸出。 (如果用戶輸入了10次試驗,那麼文本文件僅寫入「試驗10需要3次飲料」,試驗1-9沒有任何記載)。

有人可以幫我找出問題嗎?我已經看了幾個小時了,而且還沒有進一步的瞭解。謝謝!

**謝謝大家的幫助!這非常有幫助! **

+0

檢查你的for循環塊。 – OldProgrammer 2014-10-27 01:53:23

+0

將outFile的創建和關閉移動到循環之外。如果沒有另行指定,則新開啓的檔案會在開始時開始寫入。打開文件也需要時間。 – Oncaphillis 2014-10-27 01:58:07

+0

@ jinjin11我的問題是,你的數據**覆蓋**對方? – 2014-10-27 02:01:40

回答

0

問題是您每次都要創建一個新文件。爲每個循環創建一個文件並寫入,然後創建一個新的空文件然後寫入。

,所以你必須聲明打印作家圈外

PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt")); 

for (int x = 0; x < trials; x++){ 
    int counter = 0; 
    double randNum = Math.random(); 
    trialNumber++; 

    while (randNum < 0.8){ 
    counter ++; 
    randNum = Math.random(); 
    } 

total += counter; 
average = (int) total/trials; 
outFile.println("Trial " + trialNumber + " took " + counter + " drinks."); 


if (trialNumber == trials){ 
System.out.println("The average was " + average); 

    } 
outFile.close();  
    } 

而且你不應該每次關閉該文件,而循環

0

而不是PrintWriter,使用FileWriterappend標誌設置爲true

FileWiter outFile = new FileWriter(new File("bottleCap.txt"), true); 

創建PrintWriter,你在做什麼,將現有的文件截斷至零大小,因此,所有以前的輸出將被刪除。在追加模式下使用FileWriter會將輸出附加到現有文件。

或者,您可以在循環外部移動PrintWriter的創建,從而防止它被多次創建並截斷文件。

0

將您的打開文件操作移出循環,因此您只需打開一次即可在緩衝區中寫入,然後將所有字符串刷新到文件。

PrintWriter outFile = new PrintWriter (new File ("bottleCap.txt")); 
for (int x = 0; x < trials; x++){ 
    int counter = 0; 
    double randNum = Math.random(); 
    trialNumber++; 

    while (randNum < 0.8){ 
    counter ++; 
    randNum = Math.random(); 
    } 

total += counter; 
average = (int) total/trials; 
outFile.println("Trial " + trialNumber + " took " + counter + " drinks."); 
if (trialNumber == trials){ 
System.out.println("The average was " + average); 

}} 
    outFile.close(); 
0

它建議使用的BufferedWriterFileWriter鏈,和關鍵點是FileWriter將字符串追加到當前文件時,使用其構造函數的一個,它可以通過將true添加到最後一個參數,如

new FileWriter("bottleCap.txt", true)   

當我們圍繞它與BufferedWriter對象爲了更有效率,如果你要寫在文件的時間,所以它緩衝大塊的字符串,並將大塊寫入文件,顯然你可以節省了大量的時間寫入文件

注意:可以不使用BuffredWriter,但正是因爲更好的性能和緩衝字符串的大塊,並將它們寫一次

能力建議

只需更改您的

PrintWriter out = new PrintWriter("bottleCap.txt"); 

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bottleCap.txt", true))); 

例子:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bottleCap.txt", true)));){ 
      String data = " This content will append to the end of the file"; 
      File file =new File("bottleCap.txt"); 
     out.println(data); 
      }catch(IOException e){ 
     } 

有可能解決這個問題,而無需使用BufferedWriter,但正如我提到的性能就會降低。

例子:

try (PrintWriter out = new PrintWriter(new FileWriter("bottleCap.txt", true));) { 
      String data = " This content will append to the end of the file"; 
      File file = new File("bottleCap.txt"); 
      out.println(data); 

     } catch (IOException e) { 
     } 

建議

  1. 將您PrintWriter出了在爲了避免使bottleCap.txt文件多次循環。

  2. 將這些線條勾勒出的for循環以及

    total += counter; average = (int) total/trials;