2015-08-04 2 views
1

Я пытаюсь написать программу цезарного кода, которая декодирует и кодирует код. Это займет файл и вернет декодированный или закодированный файл.Код Цезаря в Java

Вот что я написал:

import java.io.*; 
import java.util.Scanner; 

public class cc 
{ 
    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException 
    { 
    System.out.println("Welcome to CaesarCipher"); 
    System.out.print("Enter 1 to encipher, or 2 to decipher (-1 to exit) "); 
    Scanner scan = new Scanner(System.in); 
    int answer = scan.nextInt(); 
    System.out.print("What non-negative shift should I use? "); 
    Scanner scan1 = new Scanner(System.in); 
    int i = scan1.nextInt(); 
    System.out.print("What is the input file name? "); 
    Scanner scan2 = new Scanner(System.in); 
    String file = scan2.nextLine(); 
    System.out.print("What is the output file name? "); 
    Scanner scan3 = new Scanner(System.in); 
    String savefile = scan3.nextLine(); 
    if (answer == 1) 
    { 
     encode(file, savefile, i); 
    } else if (answer == 2) 
    { 
     decode(file, savefile, i); 
    } else if (answer == -1) 
    { 
     System.out.println("See you later, aligator!");; 
    } 
    System.out.println("DONE!"); 
    } 

    public static void encode(String file, String savefile, int i) throws FileNotFoundException, UnsupportedEncodingException 
    { 
    File f2 = new File(savefile); 
    PrintWriter writer = new PrintWriter(f2, "UTF-8"); 

    i = i % 26 + 26; 
    File f = new File(file); 
    Scanner input = new Scanner(new FileInputStream(f)); 
     StringBuilder encoded = new StringBuilder(); 
     for (char y : file.toCharArray()) 
     { 
     if (Character.isLetter(y)) 
     { 
      if (Character.isUpperCase(y)) 
      { 
      encoded.append((char) ('A' + (y - 'A' + y) % 26)); 
      } else 
      { 
      encoded.append((char) ('a' + (y - 'a' + y) % 26)); 
      } 
     } else 
     { 
      encoded.append(y); 
     } 
     writer.print(encoded.toString()); 
    } 
    writer.close(); 
    } 

    public static void decode(String file, String savefile, int i) throws FileNotFoundException, UnsupportedEncodingException 
    { 
    encode(file, savefile, 26-i); 
    } 
} 

Проблема в том, однако, что выходной файл всегда пуст. Что не так с моим кодом?

[EDIT]

Привет, я добавил writer.close();, но я все еще есть проблемы.

Когда вход cows are mowing everyone is happy во входном файле со сдвигом 2 он дает мне выход

**hhbhbphbpphbppvhbppv.hbppv.fhbppv.fnhbppv.fnf** 

Правильно ли это?

Thanks

+0

вызова 'writer.close()' после 'writer.print()' – BoDidely

+0

\t @BoDidely Привет, я отредактировал мой вопрос. Не могли бы вы рассказать об этом. Thanks –

+0

Попытайтесь не перемещать сообщения цели при задании вопроса. Если вы продолжаете изменять вопрос, ответы становятся неактуальными, а способ работы сайта несколько разваливается. – tnw

ответ

2

Вам необходимо закрыть поток PrintWriter.

writer.close(); 
+0

Привет, я редактировал мой вопрос. Не могли бы вы рассказать об этом. Спасибо –

+0

@JohnSmith - то, что ожидаемый результат вашего Caesar Shift? Если вам нужна проверка, используйте традиционный метод ручки и бумаги. – andrewdleach

+0

@JohnSmith, если я ответил на ваш первоначальный вопрос, нажмите непрозрачную галочку рядом с ответом для других разработчиков на форуме. – andrewdleach

1

Во-первых, положить заявление на запись после окончания цикла кодирования: (!)

for (char y : ... 
    ... 
} 
writer.print(encoded.toString()); 
writer.close(); 

Во-вторых, вы не можете использовать имя файла для доступа к данным файла:

file.toCharArray() 

возвращает символ arrac, содержащий символы имени входного файла. Прочитайте файл по одному:

File f = new File(file); 
FileInputStream is = new FileInputStream(f); 
StringBuilder encoded = new StringBuilder(); 
int y; 
while((y = is.read()) != -1){ 
    // ... 
} 
Смежные вопросы