Шифровка текстового файла

Используя двунаправленный список, содержащий символы и их шифры, зашифровать текст, содержащийся в файле.
Задача № 5 (Двунаправленные списки списки) (см. "Сборник задач для начинающего программиста")

Алгоритм:
1. Создадим список используя классы:
a) класс TList -- собственно список;
b) класс TItem -- элемент списка, содержащий какую-то информацию и ссылку на след. и пред. элемент;
c) описываем конструкторы и методы (добавление эл-та в список, поиск элемента списка);
d) строим список используя метод добавления эл-та.
2. Шифруем файл:
a) создаём новый список с символами и их шифрами;
b) проходимся по всем символам исходного файла и для каждого выполняем:
- поиск в списке его шифра;
- запись полученного шифра в результирующий файл.

#include <fstream>
#include <iostream>
using namespace std;
 
// Элемент списка (двунаправленного)
 
class TItem {
     public:
            TItem();
            char letter;         // Символ
            int code;            // Шифр этого символа
            TItem* next;
            TItem* prev;
};
// - - - - - - - - - - - -
 
 
// Собственно список
 
class TList {
	private:
	  	TItem* first;
		TItem* last;
	public:
		TList();
		void AddItem(char letter, int code);
            /*  void Print();  */                     // Печать списка (использовалась при отладке)
		int GetCode(char letter);
};
// - - - - - - - - - - - -
 
 
 
 
int main() {
 
// Создаём список -- добавляем символы и их шифры
	TList cypher;
 
	int i=1, j;
	for(j='A'; j<='Z'; j++, i++) 
		cypher.AddItem( (char)j, i );
	for(j='a'; j<='z'; j++, i++)
		cypher.AddItem( (char)j, i );
	for(j='0'; j<='9'; j++, i++)
		cypher.AddItem( (char)j, i );
 
// В том случае, если исходный файл, кот. требуется зашифровать, не существует, создаём файл для теста.
	{
		ifstream iftemp("source.txt");
		if(!iftemp) {
			ofstream oftemp("source.txt");
			oftemp << "Test Encrypting!\nRedhat goes to granny.";
			oftemp.close();
		}
		else
			iftemp.close();
	}
 
// Подключаем исходный и результирующий файлы.
        ifstream fin("source.txt");
	ofstream fout("encrypted.txt");
	char temp;
 
// Для шифр каждого символа в списке-шифре и записываем найденный шифр в результирующий файл
	while( fin ) {
		temp = (char)fin.get();          // Прочитали следующий символ из файла
		if(temp == EOF)  break;          // Если этот символ -- EOF, заканчиваем цикл
		if( !cypher.GetCode(temp) )
			fout << temp;            // Нашли шифр -- записали в файл-результат
		else
			fout << cypher.GetCode(temp) << '.';      // Не нашли шифр -- записали в файл-результат исходный символ
	}
 
return 0;
}
 
// - - - - - - - - - - - -
 
 
 
 
// Конструкторы и методы
 
TItem::TItem() {
	letter = '\0';
	code = 0;
	next = NULL;
	prev = NULL;
}
 
TList::TList() {
	first = NULL;
	last = NULL;
}
 
 
// Метод. Добавляет новый элемент в список
 
void TList::AddItem(char letter, int code) {
	TItem* temp;
	temp = new TItem();
	temp->code = code;
	temp->letter = letter;
	if(!first) {
		first = temp;
	} else {
		last->next = temp;
		temp->prev = last;
	}
	last = temp;
}
 
 
// Печать списка (использовалась при отладке)
/* void TList::Print() {
	TItem* temp;
	temp = first;
	while(temp) {
		cout << temp->letter << " -> " << temp->code << endl;
		temp = temp->next;
	}
} */
 
 
// Метод. Поиск элемента списка по его содержимому.
 
int TList::GetCode(char letter) {
	TItem* temp;
	temp = first;
	while(temp) {
		if(temp->letter == letter) return temp->code;
		temp = temp->next;
	}
	return 0;
}
// - - - - - - - - - - - -

ВложениеРазмер
Sem3DvoinieSpiski5.rar105.37 кб