package algds;

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

/**
 * Die Klasse <b>Utils</b> beinhaltet Methoden, die die Ein- und
 * Ausgabe von Werten vereinfachen.
 *
 * @author Kai-Uwe Sattler (kus@iti.cs.uni-magdeburg.de)
 * @version 1.1
 */
public class IOUtils {
    /**
     * Liest einen <code>int</code>-Wert von der Standardeingabe und gibt
     * diesen als Ergebnis zur&uuml;ck.<br>
     * Beispiel:<br>
     * <code>int i = IOUtils.readInt ();</code>
     *
     * @return der gelesene <code>int</code>-Wert
     */
    public static int readInt () {
	int result = 0;
	BufferedReader reader =
	    new BufferedReader (new InputStreamReader (System.in));
	try {
	    result = Integer.parseInt (reader.readLine ());
	}
	catch (IOException e) {
	    System.err.println ("I/O Error: " + e.getMessage ());
	}
	catch (NumberFormatException e) {
	    System.err.println ("Format Error: " + e.getMessage ());
	}
	return result;
    }
    
    /**
     * Liest einen <code>float</code>-Wert von der Standardeingabe und gibt
     * diesen als Ergebnis zur&uuml;ck.
     *
     * @return der gelesene <code>float</code>-Wert
     */
    public static float readFloat () {
	float result = 0;
	BufferedReader reader =
	    new BufferedReader (new InputStreamReader (System.in));
	try {
	    result = new Float (reader.readLine ()).floatValue ();
	}
	catch (IOException e) {
	    System.err.println ("I/O Error: " + e.getMessage ());
	}
	catch (NumberFormatException e) {
	    System.err.println ("Format Error: " + e.getMessage ());
	}
	return result;
    }
    
    /**
     * Liest eine Zeichenkette von der Standardeingabe und gibt
     * diese als Ergebnis zur&uuml;ck.
     * Beispiel:<br>
     * <code>String s = IOUtils.readString ();</code>
     *
     * @return die gelesene Zeichenkette als <code>String</code>-Objekt
     */
    public static String readString () {
	String result = null;
	BufferedReader reader =
	    new BufferedReader (new InputStreamReader (System.in));
	try {
	    result = reader.readLine ();
	}
	catch (IOException e) {
	    System.err.println ("I/O Error: " + e.getMessage ());
	}
	return result;
    }


    /**
     * Liest ein Zeichen von der Standardeingabe und gibt
     * dieses als Ergebnis zur&uuml;ck.
     *
     * @return das gelesene Zeichen als <code>char</code>-Wert
     */
    public static char readChar () {
        char result = '\u0000';
        BufferedReader reader =
            new BufferedReader (new InputStreamReader (System.in));
        try {
            result = (char)reader.read ();
        }
        catch (IOException e) {
            System.err.println ("I/O Error: " + e.getMessage ());
        }
        return result;
    }

    /**
     * Liest ein Folge von Integer-Werten aus der angegebenen Datei 
     * und gibt diese in eimem Feld zur&uuml;ck.
     * Im Fehlerfall wird <code>null</code> geliefert.
     *
     * @param filename Der Name (inkl. Pfad) der einzulesenden Datei
     * @return das <code>int</code>-Feld mit den Werten
     */
    public static int[] readIntArray (String filename) {
	int[] result = null;

	Vector values = new Vector ();
	try {
	    BufferedReader reader =
		new BufferedReader (new FileReader (filename));
	    while (reader.ready ()) {
		Integer value = Integer.valueOf (reader.readLine ());
		values.addElement (value);
	    }
	    reader.close ();
	    result = new int[values.size ()];
	    for (int i = 0; i < values.size (); i++)
		result[i] = ((Integer) values.elementAt (i)).intValue ();

	}
	catch (IOException e) {
            System.err.println ("I/O Error: " + e.getMessage ());
	}

	return result;
    }
}
