# Ascii Bild einlesen



## pisco (29. Mrz 2010)

Hey Leute,
Ich hab die Aufgabe bekommen ein ganz normales Ascii Bild einzulesen und dann die Hoehe und Breite auszugeben. Wenns nicht passt in der Breite dann "Input Dismatch"

Irgendwie gehts aber bei mir ned: 

```
import java.util.Scanner;

public class AsciiShop 
{
	public static void main(String args[])
	{
		int Hoehe = 0;
		int Breite = 0;
		boolean Fehler = false;
		Scanner eingabe = new Scanner(System.in);
		String Zeile = "";
	
		while(eingabe.hasNextLine() != false)
		{
			Zeile = eingabe.nextLine();
			
			if(Breite == 0)
			{
				Breite = Zeile.length();
			} else if (Zeile.length() != Breite)
			{
				Fehler = true;
			}
			Hoehe++;
		}
		
		if (Fehler == true)
			System.out.println("INPUT MISMATCH");
		else
			System.out.println(Breite + " " + Hoehe);	
	}
}
```

Das Program hör einfach ned auf das Ascii Bild einzulesen...

Ich bin euch dankbar für jede Antwort, weil schön langsam verlier ich den Verstand...

greetz


----------



## Final_Striker (29. Mrz 2010)

Wo liegt denn das Bild, in einer Textdatei?


----------



## KYLT (29. Mrz 2010)

Nabend, 
zu erst einmal zwei Anmerkungen. 1 Variabeln sollten immer klein geschrieben werden, zweitens solltest du, wenn du fehler durch Benutzereingaben erzeugen kannst , immer nen ordentliches Fehlerhandling machen - mein großer Try-Catch ist nur nen Beispiel. Des weiteren ist es unnötig, wenn du nen fehler festgestellt hast fortzufahren, du benutzt den Inhalt ja danach nicht , also darfst du dann auch per break die Schleife verlassen.

Dann aber nochmal ne zusätzliche Frage, warum nen Scanner und keinen simplen BufferedReader?


```
import java.util.Scanner;

public class AsciiShop
{
    public static void main(String args[])
    {
        int hoehe = 0;
        int breite = 0;
        boolean fehler = false;
       try {
        Scanner eingabe = new Scanner(System.in);
        String zeile = "";
        

        while(eingabe.hasNextLine()){
            zeile = eingabe.nextLine();
            if(breite == 0) {
                breite = zeile.length();
            } else if (zeile.length() != breite)
            {
                // Bei einem Fehler brauchen wir nicht weiter zu prüfen
                fehler = true;
                break;
            }
            hoehe++;
        }

        } catch (Exception e) {
// Fehlermeldung beim auslesen, hier ausgeben
          e.printStackTrace();
        }

        if (fehler == true)
            System.out.println("INPUT MISMATCH");
        else
            System.out.println(breite + " " + hoehe);
    }
}
```


----------



## pisco (30. Mrz 2010)

hey
erstmal vielen dank für eure Antworten...

@Final_Strike
Wo liegt denn das Bild, in einer Textdatei? 

nein das geb ich einfach über das Terminal ein...

@KYLT
Erstmal danke für den Tip mit den vars(hab wieder was dazu gelernt *freu*)
Also das es anders als über die Scanner methode geht wusste ich nicht(habs auch ned anders gelernt...)
Das mit try/catch find ich eine geile Lösung nur.... kann man das vll auch anders lösen?
Ich mein jetz nicht vollkommen anders sondern irgendwie das MEIN Sourcecode halt funzen würd?(ICh möcht eigentlich wissen was bei mir falsch ist.... möcht mich ja auch verbessern ;-) )

Die Ausgabe soll eigentlich sein:

Das Bild

Die Hoehe und Breite

greetz

PS.: Hab noch ein bissl über den code nachgedacht und ich glaub ich hab die hasNextLine() Methode ned ganz verstanden:
Die liefert doch einen false bei Eingabe Ende und anstonsten ein true
kann ich dann nicht einfach mit:

if(Breite=0)
....
reader.hasNextLine()=false;

die schleife verlassen... irgendwie geht der Ausdruck ned bei mir...

greetz und good night


----------



## Suinos (30. Mrz 2010)

> ```
> while(eingabe.hasNextLine())
> ```


Je nach Art des Streams kann dies zu einer Endlosschleife werden:


			
				Java API hat gesagt.:
			
		

> This method may block while waiting for input.



Normalerweise einigt man sich bei Eingaben auf einen speziellen Wert, welcher aussagen soll, dass keine weitere Eingaben folgen werden, zum Beispiel eine leere Zeile:


```
System.out.println("Start\n---");

Scanner sc = new Scanner(System.in);
final String sentinel = "";

while (sc.hasNextLine())
{
	String line = sc.nextLine();
	
	// falls der spezielle Wert eingegeben wurde, brechen wir aus der Schleife heraus
	if (line.equals(sentinel))
	{
		break;
	}
	
	System.out.println("Eingabe: " + line);
}

sc.close();

System.out.println("\n---\nEnde");
```



			
				pisco hat gesagt.:
			
		

> Die liefert doch einen false bei Eingabe Ende und anstonsten ein true


Das stimmt, aber, wie bereits gesagt, kann die Methode solange warten, bis etwas eingegeben wurde!



			
				pisco hat gesagt.:
			
		

> reader.hasNextLine()=false;


Nein, das geht so nicht.

---



			
				KYLT hat gesagt.:
			
		

> Dann aber nochmal ne zusätzliche Frage, warum nen Scanner und keinen simplen BufferedReader?


Huh? Ist es nicht der Scanner, welcher viel einfacher zu bedienen ist?



			
				KYLT hat gesagt.:
			
		

> [JAVA=34]if (fehler == true)
> System.out.println("INPUT MISMATCH");
> [/code]


Bei deinem Stück Code kann 
	
	
	
	





```
fehler
```
 hier nur 
	
	
	
	





```
true
```
 sein, da sonst die Schleife nie verlassen wird (btw: Klammern fehlen & booleans brauchen keinen Vergleich).


----------



## pisco (30. Mrz 2010)

Hey erstmals thx für deine Antwort...

Je nach Art des Streams kann dies zu einer Endlosschleife werden:

Wie kann ich sowas verhindern?

reader.hasNextLine()=false;
Nein, das geht so nicht.

was ist falsch bzw. wie kann man das richtiger formulieren????

greetz


----------



## Suinos (30. Mrz 2010)

pisco hat gesagt.:
			
		

> Wie kann ich sowas verhindern?


Ausser mit meiner oben schon vorgeschlagenen Methode?
Gar nicht.



			
				pisco hat gesagt.:
			
		

> was ist falsch bzw. wie kann man das richtiger formulieren????


Generell: Du kannst nur Variablen einen Wert zuweisen, du versucht hier aber, dem Rückgabewert einer Methode etwas zuzuweisen.

Glaube mir, ich weiss, was du da tun willst, so funktioniert das aber nicht!

Ich finde, ehrlich gesagt, gerade keine bessere Erklärung, aber ich versuche es mit einer Analogie:



> Stell dir vor, du sitzt vor dem Fernseher und hast eine Fernbedienung in der Hand.
> [Fernbedienung = deine
> 
> 
> ...


----------

