2015-12-02 2 views
-2

Я создаю программу шифрования шифрования цезаря. Моя программа читает из .txt-файла, отображает все выходы для 26 разных смен.Сохранение результата цикла в файле сохраняет только последнюю итерацию

У меня возникли проблемы, связанные с сохранением вывода обратно в .txt: только вывод итоговой итерации - это то, что сохраняется в файле. Вместо этого я хочу сохранить все 26 итераций.

Смотрите рисунки для примера.

Console Output

.txt output

Код, который петли и записывает в файл:

static void decryption() 
    { Console.ForegroundColor = ConsoleColor.DarkBlue; 
     Console.WriteLine ("\n*********************************** Decryption *********************************"); 
     Console.ResetColor(); 
     //pulls getPath from varables class 
     string path = globalVars.getPath(); 


    string encrypted_text = System.IO.File.ReadAllText(path); //String variable that contains the text from a file. To get the text, the method in a class SystemIO is ran to read the text. It expects a parameter, which is a file directory. 
    string decoded_text = " "; 
    int shift = 0; 
    char character = '0'; 
    encrypted_text = encrypted_text.ToUpper(); 

    char[] alphabet = new char[26] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 

    Console.WriteLine("The encrypted text is \n{0}", encrypted_text);  //Display the encrypted text 

    for (int i = 0; i < alphabet.Length; i++)  //Start a loop which will display 25 different candidates of decipher 
    { 
     decoded_text = ""; 
     foreach (char c in encrypted_text) 
     { 
      character = c; 

      if (character == '\'' || character == ' ') 
       continue; 

      shift = Array.IndexOf(alphabet, character) - i;  //Define a shift which is the index of a character in an alphabet array, take away the itteration of this loop. Store the result in a variable 
      if (shift <= 0) 
       shift = shift + 26; 

      if (shift >= 26) 
       shift = shift - 26; 


      decoded_text += alphabet[shift]; 
     } 
     Console.WriteLine("\nShift {0} \n {1}", i + 1, decoded_text); 
    } 

     string filename; 
     string savePath; 

     string fileContent = decoded_text; 

     Console.WriteLine("What do you want to name your file??"); 
     filename = Console.ReadLine(); 

     Console.WriteLine("Where would you like to save your file??"); 
     savePath = Console.ReadLine(); 

File.WriteAllText(savePath + filename + ".txt", fileContent); 
     Console.WriteLine("Success"); 
     Console.WriteLine(Console.Read()); 
} 
}// ///////END OF DECRYPTION ////////// 
+0

чем вопрос? –

ответ

4

Проблема в этой строке string fileContent = decoded_text; Вы просто назначаете fileContent для последнего декодированного текста. Чтобы исправить это, поставьте fileContent перед циклом, а затем добавьте каждый decodedText на каждом шаге.

Как это:

static void decryption() 
{ 

    // ... 
    string fileContent = ""; 

    for (int i = 0; i < alphabet.Length; i++) 
    { 
     // ... 
     fileContent += "Shift " + (i+1).ToString() + "\r\n" + decoded_text + "\r\n"; 
    } 

    // ... 
    File.WriteAllText(savePath + filename + ".txt", fileContent); 
} 
+0

Спасибо Амир. оценили! –

+2

И не используйте конкатенацию строк для добавления имен файлов в имена каталогов: используйте 'Path.Combine (savePath, filename +" .txt ")', чтобы вы могли обрабатывать обе каталоги с и без символа разделителя. – CodeCaster

+1

Хорошо, спасибо за совет @CodeCaster, очень ценим. :) –

-1

Переместить линию decoded_text="" перед циклом. Это то, что заставляет файл содержать только последний бит кода.

Вы также можете использовать StringBuilder вместо добавления строки. Это более эффективно.

+0

Это похоже на правильный ответ. Может быть, вы получаете голоса, потому что это может быть лучше объяснено? – Niklas

+2

Этот ответ на самом деле ничего не говорит - что это значит? –

+0

@ Никлас как? Что означает «положить»? Он уже объявлен вне цикла. – CodeCaster

0

Проблемы заключается в том, что вы перезаписывании содержимого decoded_text в вашем for цикла:

for (int i = 0; i < alphabet.Length; i++)  //Start a loop which will display 25 different candidates of decipher 
{ 
    decoded_text = ""; 
    foreach (char c in encrypted_text) 
    { 
     character = c; 

     if (character == '\'' || character == ' ') 
      continue; 

     shift = Array.IndexOf(alphabet, character) - i;  //Define a shift which is the index of a character in an alphabet array, take away the itteration of this loop. Store the result in a variable 
     if (shift <= 0) 
      shift = shift + 26; 

     if (shift >= 26) 
      shift = shift - 26; 


     decoded_text += alphabet[shift]; 
    } 
    Console.WriteLine("\nShift {0} \n {1}", i + 1, decoded_text); 
} 

Вы назначаете ему пустую строку в вашем for цикла. Затем вы добавляете в него символы в своем вложенном цикле foreach. Но затем foreach заканчивается, for цикл снова итерации и вытирает его пустой строкой.

Так что либо полностью удалите это, либо переместите его в другое место, либо сохраните содержимое в файле, прежде чем вытирать его - я действительно не понимаю, что вы пытаетесь сделать, точно. Я имею в виду, я понимаю шифр Цезаря, но ваш пост не является отличным.

Это было бы подходящее время для установки некоторых точек разлома и поочередно проходить через ваши петли и научиться использовать инструменты отладки.

+1

Если вы удалите неизменный код OP и ваш ответ «отлаживать» от вашего ответа, вы останетесь с _ «Проблема в том, что вы переписываете содержимое decoded_text в своем цикле for [...], удаляете это полностью или переместить его в другое место, или сохранить содержимое в файл перед его очисткой "_. Можете ли вы подробнее рассказать об этом? – CodeCaster

+0

Как я уже сказал, я не совсем понял, что именно он пытается сделать, поэтому я не уточнил больше. Амир уже понял это; определите 'fileContent' перед циклом и добавьте' decoded_text' к этому до того, как вытереть его. Но да, я думаю, ты прав; это не действительно * решение * как таковое, просто говоря, что он сделал не так:/ – sab669

+0

_ «Я не совсем понял, что именно он пытается сделать» _ - затем опубликуйте комментарий, а не ответ. :) – CodeCaster

Смежные вопросы