2014-03-18 97 views
0

我正在嘗試讀取文本文件,然後在另一個文件中顯示輸出。 我只能使用掃描儀閱讀。 input.txt中java程序使用掃描儀讀取並打印到文本文件

3005045 7 
3245436 0 
7543536 3 
8684383 -1 

output.txt的應該是像

ID Number of Bags Total Cost 
** ************** ********** 

客戶支付20.50每袋如果包是4以下。 和每袋支付15.50如果袋大於4 但如果它是0或負數此消息應該出現「錯誤:袋裝打錯了」我做這個節目 ,但它只能一次(讀取一行只)

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

public class Bags { 
public static void main(String []args) throws IOException { 
    FileInputStream fileinput = new FileInputStream("input.txt"); 
    FileOutputStream fileoutput = new FileOutputStream("output.txt"); 
    Scanner infile = new Scanner(fileinput); 
    PrintWriter pw = new PrintWriter(fileoutput); 
    double total = 0, line = 0; 
    int bags = 0, ID = 0, count = 0; 
    pw.println("ID\t\tNumber of Bags\t\t\tTotal Cost"); 
    for(int i = bags; i >= 0; i++, count++){ 
     ID = infile.nextInt(); 
     i = infile.nextInt(); 
     if (i <= 0){ 
      pw.println(ID + "\tError: Wrong Number of Bags\t\t\t"); 
      break; 
     } 
     else if (i <= 4){ 
      total = (80.50)*i; 
      pw.printf("%d\t\t%d\t\t\t\t%.2f", ID, i, total); 
      break; 
     } 
     else { 
      total = ((80.50)*4)+((75.50)*(i-4)); 
      pw.printf("%d\t\t%d\t\t\t\t%.2f", ID, i, total); 
      break; 
     } 
    } 
    infile.close(); 
    pw.close(); 
} 
} 
+0

什麼input.txt中的列代表什麼?我也有點擔心'i> = 0; i ++',因爲它看起來像一個無限循環,除非'i'總是在後面設置爲<0 – rath

+0

@jpw如果OP沒有在任何地方使用nextLine(),所以消耗行分隔符沒有問題。即使每個數字都放在'nextInt()'的新行中,系統也會毫無問題地讀取它們。 – Pshemo

回答

0

你不需要在那裏循環。另外,你想逐行閱讀。這裏是你的代碼的快速修復:

public class Bags { 

public static void main(String[] args) throws IOException { 
    FileInputStream fileinput = new FileInputStream("input.txt"); 
    FileOutputStream fileoutput = new FileOutputStream("output.txt"); 
    Scanner infile = new Scanner(fileinput); 
    PrintWriter pw = new PrintWriter(fileoutput); 
    double total = 0, line = 0; 
    int bags = 0, ID = 0, count = 0; 
    pw.println("ID\t\tNumber of Bags\t\t\tTotal Cost"); 
    while(infile.hasNext()){ 

     ID = infile.nextInt(); 
     int i = infile.nextInt(); 
     if (i <= 0) { 
      pw.println(ID + "\n\t\tError: Wrong Number of Bags\t\t\t"); 

     } else if (i <= 4) { 
      total = (80.50) * i; 
      pw.printf("%d\t\t%d\t\t\t\t%.2f", ID, i, total); 

     } else { 
      total = ((80.50) * 4) + ((75.50) * (i - 4)); 
      pw.printf("%d\t\t%d\t\t\t\t%.2f", ID, i, total); 

     } 
    } 
    infile.close(); 
    pw.close(); 
} 
} 

Output.txt的

ID  Number of Bags     Total Cost 
3005045 7        548.503245436 
     Error: Wrong Number of Bags   
7543536 3        241.508684383 
     Error: Wrong Number of Bags   
+0

謝謝,但爲什麼當我使用for循環它沒有工作? – user3435095

+0

我認爲要解決這個問題,我必須在(%.2f)之後添加%n – user3435095

+0

我認爲用戶@Pshemo回答了您關於如何在此處使用for循環以及如何使用新行字符的問題。 – PCM

0

循環只能迭代一次也就不足爲奇了。在每種情況下,您都有break

此外,在這種情況下,你不應該使用for循環,尤其是不是現在你正在使用它的方式。只要看看它,你的循環只會結束時,這個條件i >= 0會是假的,這意味着i必須是消極的,但即使i將成爲-1像你輸入最後一個數字也仍然在年底增加迭代感謝i++所以你最終會與0 >= 0條件是真,所以循環會再次嘗試迭代)

而是使用

while(scanner.hasNextInt()) 

這樣,您將確保你會讀int從只有當有下一個要閱讀的文件時。只需使用預定義的bugs變量而不是i即可。

另一件事是,你是不是包括你的printf格式行分隔符。在他們每個人的末尾添加%n,並且不使用\t但指定希望每個號碼按住空格像

pw.printf("%d %9d %40.2f%n",...); 
+0

如果我刪除了一個錯誤消息,在線程「main」java.util中顯示異常。NoSuchElementException – user3435095

+0

感謝您的幫助 – user3435095

+0

檢查我的答案的更新版本。 – Pshemo

0

你不應該使用i節省「數袋」。見行i = infile.nextInt();。使用另一個變量,那麼你應該沒問題。此外,你應該繼續閱讀直到文件結束,所以你可能無法寫出for (int i = 0; i < n; i++)風格的循環。

+0

謝謝你的幫助。 – user3435095