Powtarzanie ostatniego znaku w szyfrze cezara w c++

Oto mój program:

#include 

#include 

#include 

#include 

#include 


using namespace std;


int main()

{



			ifstream plik1;

			ofstream plik2;


			plik1.open("jawny.txt");

			plik2.open("szyfrogram.txt");


			if(plik1.good() && plik2.good())

			{

				string alfabet="abcdefghijklmnoprstuwxyz";

				string cezar="defghijklmnoprstuwxyzabc";



				char znak;


				while(!plik1.eof())

				{


					plik1 >> znak;

					for(int i = 0; i<24;i++)

					{

						if( znak == alfabet[i])

						{

							if(znak == plik1.eof())

							{

                                    }

                                    else

                                    {

							plik2 << cezar[i];

                    }	}

						}


					} 


			}


	plik1.close();

	plik2.close();

}

Wynik działania tego programu to

Tekst jawny : alamakota

Tekst zaszyfrowany :dodpdnsxdd

I nie wiem co zrobić, żeby program nie powtarzał ostatniego znaku.

while(plik1>>znak)

            {

             ...

I to wszystko to wystarczy

To wystarczy aby naprawić problem o którym piszesz.

Aczkolwiek zamiast takiego monstra lepiej zrobić coś takiego:

#include 

#include 

using namespace std;


int main()

  {

   static const char alfabet[]="abcdefghijklmnoprstuwxyz";

   ifstream fin("jawny.txt");

   ofstream fout("szyfrogram.txt");

   for(char ch=0;fin.get(ch);fout.put(ch))

     {

      char *found=strchr(alfabet,ch);

      if(found) ch=alfabet[(found-alfabet+3)%(sizeof(alfabet)-1)];

     }

   return 0;

  }

Rozchodzi się mi bardziej o ten program przeze mnie napisany. Spróbowałem z tym

whie(plik1>>znak) {...

, ale program zaczą źle szyfrować. Gdzieś jeszcze musi być błąd.