# Codetabelle Einlesen und in Array speichern



## haut2000 (20. Dez 2005)

Hallo,

da ich nun schon seit mehreren Stunden vergeblich an dieser Teilaufgabe sitze, dachte ich ich könnte hier vielleicht weiter kommen. Es handelt sich um folgende Aufgabenstellung:

Ich soll ein Programm schreiben (für die Uni), welches das Vigenere Verfahren für die Verschlüsselung von Texten verwendet. D.h ich bekomme einen Quelltext in "Reinschrift", wende den Schlüssel auf den Text an und bekomme den Verschlüsselten Text, den ich wieder ausgeben muss. Das Vigenere Verfahren funktioniert recht simpel: man legt für jedes Zeichen was im Text auftreten kann einen Code fest (z.B. das "a" hat die 1, das "A" die 2, "b" die 3 etc). Diese Codetabelle muss ich nun mal zuerst einlesen aus ner externen Text-Datei. Doch da hängts schon bei mir. Die codes.txt sieht folgendermaßen aus:

```
.	0
,	1
 	2
!	3
?	4
a	5
A	6
b	7
B	8
c	9
C	10
d	11
D	12
     .
     .
     .
     .
y	53
Y	54
z	55
Z	56
0	57
1	58
2	59
3	60
4	61
5	62
6	63
7	64
8	65
9	66
:	67
;	68
"	69
-	70
_	71
(	72
)	73
+	74
```

Nun war meine Idee, die Codes in ein Array zu schreiben, wo der Index gleich dem Wert für den Buchstaben ist (z.B. codes[56]="Z" oder codes[70]="-")

Dazu habe ich folgenden Code fabriziert:


```
import java.io.*;
import Prog1Tools.IOTools;
import java.text.*;


public class Vinegre {
	
	public static void main (String[] args){
		String in = IOTools.readLine("Name der Eingabedatei: ");
		
	try {	
		
		File input = new File(in);
		Reader r = new FileReader(in);
		StreamTokenizer st = new StreamTokenizer(r);
		int indexbuffer;
		
		String charbuffer = "0";
		String[] codes = new String[100];
		int tokentype = 0;
		do {
				
			    
				st.toString();   //sollte eigentlich die Sonderzeichen zu Strings machen
                          // damit sie in sval stehen.. geht aber leider nicht!
				System.out.println(st);
				charbuffer = st.sval;
				tokentype = st.nextToken();
				codes[(int)st.nval] = charbuffer;
				tokentype = st.nextToken();
					
				
				
			} while (tokentype!=StreamTokenizer.TT_EOF);
			
		
		r.close();
		for (int i=0; i < codes.length; i++) {
			
			System.out.println("Index[" +i +"] = " +codes[i]);  //Test ob Array richtige Werte enthält
		}
		
		}
			catch (IOException e) {
				System.out.println(e);
		
			};
			
		
	}
}
```

Das Problem dabei ist, dass die Sonderzeichen am Anfang des Textes wie "."  ","  "!" "?" nicht in der sval Variable stehen und somit mein Array auf den ersten 4 Indiezies Null stehen hat. 
Das gleiche Problem ist am Schluss des Textes ab Linie 57, wo die Zahlen kommen. Da gibts natürlich auch durcheinander und mir ist klar dass das so nicht klappen kann. 
Auch Line 2 ist kompliziert: ich muss ein Leerzeichen im Array abspeichern!

Wer kennt da eine andere Möglichkeit? Kann man mit Java z.b. nur das erste Zeichen einer Zeile einlesen, es dann abspeichern, dann weiter gehen bis Zeilenende, die letze Zahl als Index abspeichern...???

Ziel ist es das Array später als Basis für die Verschlüsselung zu benutzen, so dass der zu verschlüsselnde Text sofort für jeden Buchstaben in die entsprechenden Zahlen gewandelt werden kann. 

Beispiel:

A b b a

entspräche der Zeichenfolge

6272725 (die 2 steht für das Leerzeichen!!!)


Vielen Dank schonmal fürs Lesen. Ich hoffe jemand kann mir weiterhelfen.
	
	
	
	





```

```


----------



## haut2000 (21. Dez 2005)

OK, ich habs doch noch hinbekommen:


```
import java.io.*;
import Prog1Tools.IOTools;
import java.text.*;


public class vigenere2 {
	
	public static void main(String args[]) throws IOException {
		
		String in = IOTools.readLine("Name der Eingabedatei: ");
		
	try {	
		
		File input = new File(in);
		
		BufferedReader r = new BufferedReader (new FileReader(in));
		
				
		int j=0;
		char[] codes = new char[100];
		String ch;
		StringBuffer lineBuff = new StringBuffer();
		
		while ( (ch = r.readLine())!= null) {
				
			lineBuff.append(ch);
			codes[j]=lineBuff.charAt(0);
			j++;
			lineBuff.setLength(0);
				
			}
			
		
		r.close();
		for (int i=0; i < codes.length; i++) {
			
			System.out.println("Index[" +i +"] = " +codes[i]);  //Test ob Array richtige Werte enthält
		}
		
		}
		
		catch (IOException e) {
		System.out.println(e);
		
		};
			
		
	}
}
```

So passt das Ganze!!!


----------

