import java.io.*;

public class Einlesen
{
        public static void main(String [] args) 
        {
                FileInputStream dis=null;               // arbeitet auf dem Eingabefile
                DataInputStream in=null;                // arbeitet auf dem Eingabestrom aus dem Eingabefile
                long bestnummer;                        
                String artikel;
                float preis;
                int anzahl;
                float kosten=0;                         // summiert Gesamtkosten
		double r_kosten;			// gerundete Kosten
                String zwischen,zeile="";               // fuer die schoene Formatierung
                if (args.length!=1)                     // Kontrolle, ob die Eingabedatei mit angegeben wurde
                {       System.out.println("Bitte die Eingabedatei in der Kommandozeile mit eingeben !");
                        System.exit(1);
                }
                try
                {
                        dis= new FileInputStream(args[0]);      // Fehlersicheres oeffnen der beiden Stroeme
                        in=new DataInputStream(dis);            // dabei muss die Eingabedatei als Parameter da sein
                }
                catch (FileNotFoundException e)                 // faengt Fehler, falls Eingabefile nicht existiert
                {       System.out.println("Existiert das file : "+args[0]+" ueberhaupt ?");
                        System.exit(1);
                }
                System.out.println("Rechnung :\n");
                System.out.println("Bestellnummer  Artikelbezeichnung               Preis    Stueck");
                System.out.println("=============  =============================    =====    ======\n");
                try
                {
                        for (;;)                                // ewige Schleife : unbekannte file-Groesse
                                                                // also Abbruch mit Exception
                        {       zeile="";
                                bestnummer=in.readLong();       // Bestellnummer einlesen
                                zwischen=java.lang.Long.toString(bestnummer);   // in einen String verwandeln
                                for (int i=0;i<(12-zwischen.length());i++)      // fuer Layout : rechtsbuendig in die 
                                                                                // dafuer vorgesehene Spalte
                                        zeile+=" ";
                                zeile+=zwischen;                                // und in String zeile geben
                                artikel=in.readUTF();                           // dasselbe Vorgehen wie bei bestnummer
                                zwischen=artikel.toString();
                                zeile+="   "+zwischen;
                                for (int i=0;i<30-zwischen.length();i++)
                                        zeile+=" ";
                                preis=in.readFloat();                           // dasselber Vorgehen wie bei bestnummer
                                zwischen=java.lang.Float.toString(preis);
                                anzahl=new Float(preis).intValue();             // bis auf hier : damit die Dezimalpunkte
                                                                                // buendig sind, muss Vorkommateil
                                                                                // betrachtet werden !
                                zwischen=java.lang.Integer.toString(anzahl);
                                for (int i=0;i<5-zwischen.length();i++)         // Vorspann an Spaces mittels Vorkommateil !
                                        zeile+=" ";
                                zeile+=java.lang.Float.toString(preis);
                                if (java.lang.Float.toString(preis).length()==java.lang.Integer.toString(anzahl).length()+2)
                                        zeile+=" ";                             // wenn nur eine Nachkommastelle => + " "
                                zeile+="  ";
                                anzahl=in.readInt();                            // dasselbe Vorgehen wie bei bestnummer
                                kosten+=preis*anzahl;
                                zwischen="";
                                zwischen=java.lang.Integer.toString(anzahl);
                                for (int i=0;i<5-zwischen.length();i++)
                                        zeile+=" ";
                                zeile+=zwischen;
                                System.out.println(zeile);                      // und fertig formatierte Zeile ausgeben
                        }
                }
                catch (IOException e)   { }                                     // faengt die Fehlerquelle "file zuende" auf
                zeile="               Gesamtkosten :                ";
		r_kosten=Math.round(kosten*100)/100.0;				// Runden auf Pfennige
                zwischen=java.lang.Double.toString(r_kosten);
                for (int i=0; i<5-java.lang.Integer.toString(new java.lang.Double(kosten).intValue()).length(); i++)
                                                                                // hier wird ein neues Float Object mit dem
                                                                                // Gesamtpreis initialisiert, dann der
                                                                                // Vorkommateil benutzt, um mittels des
                                                                                // Integer-Objektes die Laenge der
                                                                                // Stringdarstellung des Vorkommateils zu
                                                                                // ermitteln. So wird der Dezimalpunkt
                                                                                // buendig !
                        zeile+=" ";
                zeile+=zwischen;
                System.out.println(zeile);
                try
                {
                        dis.close();                                            // fehlersicheres Schliessen des files
                }
                catch (IOException e)   {       }
        }
}
