Я работаю над программой, которая может кодировать, а затем декодировать текст на С++. Я использую библиотеку стека. Принцип работы программы заключается в том, что сначала она запрашивает у вас ключ шифрования, который вы вводите вручную. Затем он запрашивает имя файла, который является текстовым файлом. Если это обычный текстовый файл, сообщение кодируется в новый файл и добавляется расширение .iia. Если текстовый файл уже имеет расширение .iia, то он декодирует сообщение, если ключ шифрования совпадает с тем, который использовался для его кодирования.
Моя программа кодирует и декодирует, но количество символов, которые она декодирует, определяется temp.size() % cypher.length()
, который находится в цикле while в функции readFileEncode()
. Я думаю, это то, что мешает кодированию всего файла, а затем правильно декодировать. Другими словами, в конечном файле после декодирования, скажем, из «example.txt.iia» обратно в «example.txt» отсутствует большая часть текста из исходного файла «example.txt». Я пробовал только cypher.length()
, но, конечно, это ничего не кодирует и не декодирует. Весь процесс определяется этим аргументом для декодирования и кодирования.
Кажется, я не могу найти точную логику для кодирования и декодирования всех символов в файле любого размера. Вот следующий код для функции, которая выполняет декодирование и кодирование:
РЕДАКТИРОВАТЬ: Используя код WhozCraig, который он отредактировал для меня:
void readFileEncode(string fileName, stack<char> &text, string cypher)
{
std::ifstream file(fileName, std::ios::in|std::ios::binary);
stack<char> temp;
char ch;
while (file.get(ch))
temp.push(ch ^ cypher[temp.size() % cypher.length()]);
while (!temp.empty())
{
text.push(temp.top());
temp.pop();
}
}
РЕДАКТИРОВАТЬ: требуется стек. Я собираюсь реализовать свой собственный класс стека, но сначала я пытаюсь заставить его работать с библиотекой стека. Кроме того, если есть лучший способ реализовать это, пожалуйста, дайте мне знать. В противном случае, я считаю, что в этом нет ничего плохого, кроме как заставить его пройти цикл для кодирования и декодирования всего файла. Я просто не уверен, почему он останавливается, скажем, на 20 символах иногда или на десяти символах. Я знаю, что это также связано с длиной шифра, поэтому я считаю, что это связано с% (мод). Только не знаю как переписать.
РЕДАКТИРОВАТЬ: Хорошо, попробовал решение WhozCraig, и я не получаю желаемого результата, поэтому теперь ошибка должна быть в моем файле main. Вот мой код для основного:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cctype>
#include <stack>
using namespace std;
void readFileEncode(string fileName, stack<char> &text, string cypher);
int main()
{
stack<char> text; // allows me to use stack from standard library
string cypher;
string inputFileName;
string outputFileName;
int position;
cout << "Enter a cypher code" << endl;
cin >> cypher;
cout << "Enter the name of the input file" << endl;
cin >> inputFileName;
position = inputFileName.find(".iia");//checks to see if the input file has the iia extension
if (position > 1){
outputFileName = inputFileName;
outputFileName.erase(position, position + 3);// if input file has the .iia extension it is erased
}
else
//outputFileName.erase(position, position + 3);// remove the .txt extension and
outputFileName = inputFileName + ".iia";// add the .iia extension to file if it does not have it
cout << "Here is the new name of the inputfile " << outputFileName << endl; // shows you that it did actually put the .iia on or erase it depending on the situation
system("pause");
readFileEncode(inputFileName, text, cypher); //calls function
std::ofstream file(outputFileName); // calling function
while (text.size()){// goes through text file
file << text.top();
text.pop(); //clears pop
}
system("pause");
}
По сути, я читаю файл .txt для шифрования, а затем помещаю расширение файла .iia в имя файла. Потом прохожу обратно, ввожу файл обратно с расширением .iia, чтобы раскодировать его обратно. Когда я расшифровываю это обратно, это тарабарщина примерно после первых десяти слов.
@WhozCraig Имеет ли значение, какие пробелы, новые строки или знаки препинания есть в файле? Может быть, с полным решением здесь вы можете указать мне, что не так.
std::ios::out | std::ios::binary
и использоватьfile.put(text.top());
. Попробуйте. 18.03.2014readFileEncode()
в ifstream. Опять же, имеет смысл после того, как вы укажете на то, что находится прямо перед вашим лицом. Хотел бы я иметь твой талант. Спасибо за помощь. Это настраивает меня на правильные классы стека и argc main. Очень признателен. 18.03.2014