Skip to content

Instantly share code, notes, and snippets.

@LifeMoroz
Created October 18, 2012 00:15
Show Gist options
  • Save LifeMoroz/3909151 to your computer and use it in GitHub Desktop.
Save LifeMoroz/3909151 to your computer and use it in GitHub Desktop.
#include <stdlib.h> // Для функции exit()
#include <fstream> // Для файловых потоков
#include <iostream>
#include <windows.h>
//#include "ConsolCyr.h"
#include <string>
using namespace std;
const int lenName = 13; // max длина имени файла
const int lenString = 60; // Длина вспомогательного массива
int sumS(char *chr); //подсчет суммы кодов
int main()
{
setlocale(LC_ALL, "rus");
char source[lenName]; // Массив для имени файла
cout << "\nВведите имя кодового файла: ";
cin >> source;
ifstream inFile; // Входной файловый поток
// Открыть файл source и связать его с потоком inFile:
inFile.open(source);
if (!inFile) // Проверить правильность открытия файла
{ cerr << "\nОшибка при открытии файла " << source;
exit(1); // Завершение программы
}
// Вспомогательный массив для чтения:
char string[lenString];
char next;
cin.get(); // Убирает код из потока cin
int *ptr, j=0, max=1000;
ptr=new int[max];
while(1) // Неограниченный цикл
{
if (j==max) //расширяем массив ключей, если не хватает места
{
int *ptr1;
ptr1=new int[max];
for(int i=0;i<max;i++)
{ptr1[i]=ptr[i];}
delete[] ptr;
ptr=new int[max+1000];
for(int i=0;i<max;i++)
{ptr[i]=ptr1[i];}
delete[] ptr1;
max+=1000;
}
for(int i=0; i<lenString; i++) // на всякий случай запонляем string пробелами,
//что бы было проще распознaвать конец слова.
{string[i]=' ';}
inFile >> string; //получаем слово
ptr[j]=sumS(string); //сумма кодов символов
next = inFile.peek();
j++;
if (next == EOF) break;
}
inFile.close();
ofstream onFile1("End_file.txt", ios::trunc | ios::binary); //открываем и усекаем фаил для конечного результата.
if (!onFile1) // Проверить правильность открытия файла
{ cerr << "\nОшибка при открытии файла " << source;
exit(1); // Завершение программы
}
cout << "\nВведите имя кодируемого файла: ";
cin >> source;
ifstream inFile2(source, ios::binary); //поток на чтение
if (!inFile2) // Проверить правильность открытия файла
{ cerr << "\nОшибка при открытии файла " << source;
exit(1); // Завершение программы
}
int k=0;
char chr[2], ch[2], ch1[2], charray[256]; //вдруг пригодится
cout << "Идет шифрование..." << endl;
for (int i=0; i<20; i++) cout << char(42); cout <<char(35) << char(98) << char(121) << char(0) <<char(82) << char(85)<< char(83)<<char(76)<<char(65)<<char(78);
for (int i=0; i<20; i++) cout << char(42);
cout<< endl;
cin >> ch;
OemToCharA(ch, ch);
for (int i=0; i<=256;i++) charray[i]=0;
while(inFile2) //шифрование
{
if (k==j) k=0; // если ключей не хватает - начать с начала
inFile2.read(chr, 1);
if (inFile2.eof()) break;
//cout << "преобразую символ " << chr[0];
ch1[0]=(ptr[k]^chr[0]);
if (ch[0]==chr[0])
{
charray[ch1[0]+128]+=1;
}
//cout << " Код равен " << ptr[k] << " получился символ " << chr[0] << endl;
onFile1.write(ch1, 1);
k++;
}
j=0;
for (int i=0; i<256;i++)
{
if (charray[i]>0) cout << "Код "<<++j<< " в ASCII " << char(i-128)<<endl;
}
cout<< "Всего кодов "<< j<<endl;
system("pause");
exit(0);
return 0;
}
int sumS(char *chr) //подсчет суммы кодов
{
char result=0;
int i=0;
while (chr[i]!=' ')
{
result+=chr[i];
i++;
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment