@Override
	public List<List<String>> read(String filename) throws IllegalArgumentException {
		/**
		 * @step Ensure that filename is not null and file exists
		 */
		try {
			validateFileName(filename);
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
		/**
		 * @step parse the file and convert to <code>List</code> of <code>List</code> of <code>Strings</code>
		 */
		Scanner scan = null;
		List<List<String>> returnList = new ArrayList<List<String>>();
		try {
			scan = new Scanner(new File(filename));
			int i=0;
			for (;i<getNumRows() && scan.hasNextLine();i++) {
				String[] sarr = scan.nextLine().split("\\s+");
				List<String> tempList = new ArrayList<String>();
				if (sarr.length == getNumCols()) {
					for (int j=0;j<getNumCols();j++) {
						if (sarr[j].trim().equals("inf")) {
							tempList.add("inf");
						} else {
							Double.parseDouble(sarr[j].trim());
							tempList.add(sarr[j]);
						}
					}
				} else {
					ExceptionHandler.handle(new Turner99FormatException("Incorrect " +
							"number of columns (" + sarr.length + ") on row " + i));
					return null;
				}
				returnList.add(tempList);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (scan != null) {
				scan.close();
			}
		}
		/**
		 * @step return the parsed results
		 */
		return returnList;
	}