# Java/Rot13/Eingabeumleitung



## Carlos Valderra (3. Jun 2012)

Folgende Aufgabe:



> Schreiben Sie ein Java-Programm namens Rot13.java, welches die vorgegebene Textdateidurch Eingabeumleitung von der Shell einlesen kann und die eingelesenen Buchstabennach dem Rot13-Algorithmus de- bzw. enkodiert auf der Standardausgabe ausgibt.Zahlen und sonstige Zeichen sollen nicht verändert werden.An dem bereitgestellten Text können Sie prüfen, ob Ihr Programm korrekt arbeitet. LassenSie sich nicht verwirren, es handelt sich tatsächlich um einen deutschen Text.



Soweit bin ich mittlerweile mit dem Quellcode:



> import IOulm.*;
> 
> public class Rot13 {
> 
> ...



Im Terminal klappt das Programm ganz wunderbar, nur bei der Eingabeumleitung hakt es. Ich hab keine Ahnung, wie ich das ganze umsetzten soll.


----------



## faetzminator (3. Jun 2012)

Du liest es mit einem Scanner, Reader o.ä. von [c]System.in[/c] und schreibst es mit einem Writer in ein [c]new File(args[0])[/c].


----------



## Carlos Valderra (3. Jun 2012)

Verstehe ich das eigentlich richtig? Man gibt Text in die Shell ein (nicht in das Terminal) und dann wird es encodiert? Was wäre bei Windows 7 die Shell?


----------



## r.w. (3. Jun 2012)

Carlos Valderra hat gesagt.:


> Verstehe ich das eigentlich richtig? Man gibt Text in die Shell ein (nicht in das Terminal) und dann wird es encodiert? Was wäre bei Windows 7 die Shell?



Die cmd.exe.


----------



## Carlos Valderra (4. Jun 2012)

Bin mittlerweile soweit und komme nicht weiter: (""thzzvonrepura.txt"" enthält den zu decodierenden Text)


```
import IOulm.*;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;


public class Rot13 { 

    public static void main(String[] args) {
        String s = args[0];
        File File = new File ("thzzvonrepura.txt");
		Scanner sc  = new Scanner(File);
		 catch (FileNotFoundException e) {
		e.printStackTrace();
		}
		
		System.out.println("Bitte Dateinamen eingeben :");
		
		
		for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if       (c >= 'a' && c <= 'm') c += 13;
            else if  (c >= 'n' && c <= 'z') c -= 13;
            else if  (c >= 'A' && c <= 'M') c += 13;
            else if  (c >= 'A' && c <= 'Z') c -= 13;
            System.out.print(c);
        }
        System.out.println();
    }

}
```

Es kommen folgende Fehlermeldungen:



> Rot13.java:13: 'catch' without 'try'
> catch (FileNotFoundException e) {
> ^
> Rot13.java:13: ')' expected
> ...


----------



## Blackhole16 (4. Jun 2012)

hi,

wie canst du etwas catchen, was nich getryed wird? 

Schau mal bei Try / Catch in Java vorbei.

mfg
BH16


----------



## knucki (4. Jun 2012)

Die Antwort steht doch da. Du benutzt catch ohne try

:rtfm:


----------



## Carlos Valderra (4. Jun 2012)

Ok, hab jetzt ein try hinzugefügt. Funktioniert jetzt ohne Fehlermeldung.
 Er ließt aber immernoch nur Buchstaben vom Terminal ein und nicht von der Datei.


```
import IOulm.*;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;


public class Rot13 { 

    public static void main(String[] args) {
        String s = args[0];
        File File = new File ("thzzvonrepura.txt");
		
		 try {
		 Scanner sc  = new Scanner(File);
		 }
		 catch (FileNotFoundException e) {
		e.printStackTrace();
		}
		
	
		
		
		for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if       (c >= 'a' && c <= 'm') c += 13;
            else if  (c >= 'n' && c <= 'z') c -= 13;
            else if  (c >= 'A' && c <= 'M') c += 13;
            else if  (c >= 'A' && c <= 'Z') c -= 13;
            System.out.print(c);
        }
        System.out.println();
    }

}
```


----------



## knucki (4. Jun 2012)

Du durchläufst auch nur s. s enthält aber nicht den Inhalt der Datei!


----------



## Carlos Valderra (4. Jun 2012)

knucki hat gesagt.:


> Du durchläufst auch nur s. s enthält aber nicht den Inhalt der Datei!



Und was würde den Inhalt der Datei enthalten?


----------



## knucki (4. Jun 2012)

sc.nextLine
sc.toString

...


----------



## faetzminator (4. Jun 2012)

Öhm, ich muss mich sowie auch die Vorschläge verbessern. Nochmals genau die Anforderung lesen: es soll die *Eingabeumleitung[/c], d.h. [c]java DeinProgramm < someFile.txt[/c] verwendet werden. Insofern musst du natürlich nicht [c]new Scanner(new File(...))[/c] verwenden, sondern [c]new Scanner(System.in)[/c]. Ansonsten kannst du genau gleich weiter machen.*


----------



## kay73 (5. Jun 2012)

So als Anregung...

Man bekommt die Zuordnung Buchstabe, Leerzeichen, Ziffer usw in der 
	
	
	
	





```
Character
```
-Klasse geschenkt. Ich habe immer ein schlechtes Gefuehl, in Java mit den numerischen Werten eines ASCII-Zeichens herumzurechnen, daher der Ansatz mit dem Alphabet-Array. Der Code rotiert nur nur Buchstaben und beruecksichtigt Gross- und Kleinschreibung, Ziffern und Leerzeichen werden unveraendert uebernommen, unbekannte sonstige Zeichen werden ignoriert.

Du kannst den Code in der Eclipse Console laufen lassen; um das Programm zu beenden muss es das EOD-Signal bekommen. Unter UNIX ist das Steuerung+D, wie das in Windows ist, weiss ich leider nicht.

```
package rot13;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	static final String alphabet = "abcdefghijklmnopqrstuvwxyz";
	static final int LENGTH = alphabet.length();
	
	public static void main(String[] args) throws IOException {
		
		final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for(;;) { 				 
			final String input = br.readLine();
			if(input == null) { 
				break;
			}
		
			final StringBuilder b = new StringBuilder(input.length());

			for(final Character ch : input.toCharArray()) { 
				
				if(Character.isLetter(ch)) {
							
					final int index = alphabet.indexOf(Character.toLowerCase(ch.charValue()));
					if(index == -1) {
						continue;
					}
					
					int i = index + 13;
					if( i >= LENGTH) { 
						i -= LENGTH;
					}
					
					final char c2 = alphabet.charAt(i);
					b.append(Character.isUpperCase(ch) ? Character.toUpperCase(c2) : c2);
				} else if(Character.isWhitespace(ch) || Character.isDigit(ch)) { 
					b.append(ch);
				}
			}
			
			System.out.println(b.toString());
		}
	}
}
```


----------



## Carlos Valderra (7. Jun 2012)

Vielen Dank, für die Hilfestellungen. Das hier wäre übrigens die Lösung gewesen:

```
import IOulm.*;

public class Rot13 {
   public static void main(String[] args) {
      char ch = ' ';
      //Hilfvariable (ASCI-Code des Buchstabens)
      int encrypted = 0;
                
      while (Urc.readChar()) {
         ch = Urc.getChar();
            
         if (Character.isLetter(ch)) {
            encrypted = ch + 13;
                
            //Kleinbuchstabe und Verschiebung geht ueber ABC hinaus
            if (Character.isLowerCase(ch) && encrypted > 'z') {
               encrypted = ch - 13;
            }
                
	    //Gruossbuchstabe und Verschiebung geht ueber ABC hinaus
            if (Character.isUpperCase(ch) && encrypted > 'Z') {
               encrypted = ch - 13;
            }
                
	    //Verschobenen Buchstaben ausgeben (ASCI-Code zu char machen)
            System.out.print((char) encrypted);
         } else { //Keine Verschiebung notwendig
            System.out.print(ch);
         }
      }
   }
}
```


----------

