Szyfr Cezara - c++

0

Witam,
Próbuję napisać program, który odczytuje tekst z jednego pliku, koduje go szyfrem Cezara i zapisuje zaszyfrowany tekst do drugiego pliku.
Program wprawdzie napisałem, ale nie działa prawidłowo. Czy ktoś mógłby sprawdzić mój kod i ewentualnie wskazać błąd w rozumowaniu?

#include <fstream>
#include <cstdlib>

int main(int argc, char *argv[])//wczytywanie nazw z konsoli cmd
{
    int n = std::atof(argv[1]), placeASCI, stepsAdd = 0, stepsFree = 0; //atof konwertuje tekst na liczbe bo argv jest typu char, zakres 26 bo tyle jest liter w alfabecie
    std::string input = argv[2], output = argv[3]; //nazwy plikow
    std::string line; //pojedyncza linia
    std::fstream file1, file2;

    file1.open(input, std::ios::in); //odczyt pliku
    file2.open(output, std::ios::out); // zapis pliku

    while(getline(file1, line))
    {
        for(int i = 0; i < line.size(); i++)
        {
            placeASCI = int(line[i]); // numer asci znaku

            if((placeASCI >= int('a') && placeASCI <= int('z')) || (placeASCI >= int('A') && placeASCI <= int('Z'))) // czy znak jest litera mala lub duza
            {
                if(placeASCI >= int('a') && placeASCI <= int('z')) // jesli znak to mala litera
                {
                    if(n > 0)
                    {
                        stepsAdd = n % 26; // ile przejsc do przodu trzeba wykonac
                        stepsFree = int('z') - int(line[i]); //ile jest wolnych krokow az do litery 'z'
                        if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do przodu mniejsza od ilosci wolnych krokow do litery 'z'
                        {
                            line[i] = char(int(line[i]) + stepsAdd);
                        }
                        else
                        {
                            line[i] = char(stepsAdd - stepsFree + int('a') - 1);
                        }
                    }
                    else if(n < 0)
                    {
                        stepsAdd = n % 26; // ile przejsc do tylu trzeba wykonac
                        stepsFree = int(line[i]) - int('a'); // ile jest wolnych krokow do litery a
                        if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do tylu mniejsza od ilosci wolnych krokow do litery 'a'
                        {
                            line[i] = char(int(line[i]) - stepsAdd);
                        }
                        else
                        {
                            line[i] = char(int('z') - (stepsAdd - stepsFree) + 1);
                        }
                    }
                }
                else //duza litera
                {
                    if(n > 0)
                    {
                        stepsAdd = n % 26; // ile przejsc do przodu trzeba wykonac
                        stepsFree = int('Z') - int(line[i]); //ile jest wolnych krokow az do litery 'z'
                        if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do przodu mniejsza od ilosci wolnych krokow do litery 'z'
                        {
                            line[i] = char(int(line[i]) + stepsAdd);
                        }
                        else
                        {
                            line[i] = char(stepsAdd - stepsFree + int('A') - 1);
                        }
                    }
                    else if(n < 0)
                    {
                        stepsAdd = n % 26; // ile przejsc do tylu trzeba wykonac
                        stepsFree = int(line[i]) - int('A'); // ile jest wolnych krokow do litery a
                        if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do tylu mniejsza od ilosci wolnych krokow do litery 'a'
                        {
                            line[i] = char(int(line[i]) - stepsAdd);
                        }
                        else
                        {
                            line[i] = char(int('Z') - (stepsAdd - stepsFree) + 1);
                        }
                    }
                }

            }

        }
        file2 << line << " \n"; // zapis zaszyfrowanej linii do pliku
    }

}


Przykładowo: jeśli tekst, który trzeba zaszyfrować to:
Bwf Dbftbs!
Wfoj, wjej, wjdj!

to mój wynik jest taki:
Cxg Ecguct!
Xgpk, xkfk, xkek!

a powinien być taki:
Ave Caesar!
Veni, vidi, vici!

0

Problem w tym że szyfrujesz zamiast odszyfrowywać.
Zauważ że musisz wziąć poprzednią literę zaś bierzesz następną.

0

Przykładzik: 1.png

0

Wywal to badziewie i napisz po ludzku. Zobacz trzy razy mniej kodu zaś potrafi z pliku do pliku lub z konsoli na konsole.

#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <cstdlib>
using namespace std;

void Caesar(istream &sin,ostream &sout,int key)
{
	key=max(min(key,25),-25);
	for(int ch;(ch=sin.get())!=EOF;sout.put(ch))
	{
		bool upper=isupper(ch);
		if((!upper)&&(!islower(ch))) continue;
		if(upper) ch=tolower(ch);
		ch='a'+(ch-'a'+26+key)%26;
		if(upper) ch=toupper(ch);
	}
}

int fatal(bool ok,const char *msg) { if(!ok) exit((cout<<msg<<endl).good()); }

int main(int n,char *p[])
{
	fatal(n>=2,"Nie podano klucza");
	int key=atol(p[1]);
	fatal(key,"Niepoprawny klucz");
	ifstream fin;
	ofstream fout;
	if(n>=3) fin.open(p[2]); else fin.clear(ios::badbit);
	if(n>=4) fout.open(p[3]); else fout.clear(ios::badbit);
	if(fin) cin.rdbuf(fin.rdbuf()); else { cout<<"Wczytywanie z konsoli"<<endl; }
	if(fout) cout.rdbuf(fout.rdbuf()); else { cout<<"Wyjscie na konsole"<<endl; }
	Caesar(cin,cout,key);
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1