Witam, mam problem z szyfrowaniem, a mianowicie mój program działa poprawnie tylko, w niektórych przypadkach.
Daje do wklejenia program, gdyby ktoś chciał.
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
inline int sprawdz(char znak)
{
//jesli jest mala litera
if(znak >= 'a' && znak <= 'z') return 0;
//jesli jest duza litera
if(znak >= 'A' && znak <= 'Z') return 1;
//inna niż litera
return 2;
}
void szyfruj( string &tab)
{
int pom;
char a, z;
int x;
string kod;
fstream klucz;
klucz.open("klucz.txt", ios::out | ios::app);
for(int i = 0; i < tab.size(); i++)
{
x = rand() % 26;
kod += 'A' + x;
}
for(int i = 0; i < tab.size(); i++)
{
//ustalienie wielkosci litery - funkcja sprawdz
pom = sprawdz(tab[i]);
if(pom < 2)
{
if(pom == 0)
a = 'a', z = 'z';
else
a = 'A', z = 'Z';
if( (tab[i]-a) + (kod[i]-'A') <= 26) //26
{
tab[i] += (kod[i]-'A');
klucz << kod[i];
}else{
tab[i] += (kod[i]-'A') - 26;
klucz << kod[i];
}
}
} klucz.close();
}
void deszyfruj( string &tab)
{
int pom;
char a, z;
int x;
string kod;
kod.clear();
fstream klucz;
klucz.open("klucz.txt", ios::in);
getline(klucz,kod);
for(int i = 0; i < tab.size(); i++)
{
//ustalienie wielkosci litery - funkcja sprawdz
pom = sprawdz(tab[i]);
x = (int)(kod[i]-'A');
if(pom < 2)
{
if(pom == 0)
a = 'a', z = 'z';
else
a = 'A', z = 'Z';
if( (tab[i]-a) - x < 0) //26
{
tab[i] += (26 - x);
}else{
tab[i] -= x;
}
}
} klucz.close();
}
int main(int argc, char* argv[])
{
string odczyt, zapis;
fstream plik,szyfr;
int odpowiedz;
srand(time(NULL));
if(argc ==3)
{
odczyt = argv[1];
zapis = argv[2];
}
else
{
cout <<"Podaj nazwe pliku do odczytu : ";
cin >> odczyt;
cout <<"Podaj nazwe pliku do zapisu : ";
cin >> zapis;
}
plik.open(odczyt, ios::in );
if(plik.good())
{
string wiersz;
cout << "Zaszyfruj [1] Odszyfruj [2] : ";
cin >> odpowiedz;
szyfr.open(zapis, ios::out);
switch(odpowiedz)
{
case 1:
while(getline(plik,wiersz))
{
szyfruj(wiersz);
szyfr << wiersz + "\n";
}
break;
case 2:
while(getline(plik,wiersz))
{
deszyfruj(wiersz);
szyfr << wiersz + "\n";
}
remove("klucz.txt");
break;
}
szyfr.close();
}else cout << "Bledna nazwa pliku";
plik.close();
return 0;
}
A nie działa mi mianowicie funkcja deszyfruj, bo klucz jak i szyfrogram są poprawnie generowane.
void deszyfruj( string &tab)
{
int pom;
char a, z;
int x;
string kod;
kod.clear();
fstream klucz;
klucz.open("klucz.txt", ios::in);
getline(klucz,kod);
for(int i = 0; i < tab.size(); i++)
{
//ustalienie wielkosci litery - funkcja sprawdz
pom = sprawdz(tab[i]);
x = (int)(kod[i]-'A');
if(pom < 2)
{
if(pom == 0)
a = 'a', z = 'z';
else
a = 'A', z = 'Z';
if( (tab[i]-a) - x < 0) //26
{
tab[i] += (26 - x);
}else{
tab[i] -= x;
}
}
} klucz.close();
}