So, I'm trying to create a Caesar Cipher using C++. It's supposed to be able to calculate the shift depending on what letter appears the most (which would mean that it's "e"). It's also supposed to have wrap around text, which I've tried to think of a way to have it done, but I just can't understand how to do it in the first place.

So I got a lot of the code written, and I managed to compile it. However, when I run it, it doesn't actually do anything. It just copies whatever was in the original file, and put it in the outfile.

Any help is much appreciated!

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>

using namespace std;
const int ARRAYSIZE = 128;

void characterCount(char ch, int list[]);
void calcShift( int& shift, int list[]);
void writeOutput(ifstream &in, ofstream &out, int shift);

int main()
	int asciiCode = 0,
		shift = 0;
	string filename;
	char ch;
	ifstream infile;
	ofstream outfile;
	//Get input file
	cout << "Input file name: ";
	getline(cin, filename);;
		if (!infile.is_open()) { //if it doesn't exist, exit
			cout << "Unable to open file or it doesn't exist." << endl;
			return 1;
	//Get output file

	cout << "Output file name: ";
	getline(cin, filename);
	//open the outfile, if it doesn't exist, the program will automatically create one.;
	int list[ARRAYSIZE] = {0}; //Setting everything to 0
		while (infile.peek() != EOF) //Until the end of file is reached...
			characterCount(ch, list); //Go count the character
	//Rewind it
	calcShift (shift, list); //Calculate the shift based on the most characters counted
	writeOutput(infile, outfile, shift); //Decypher and write to the other document
	return 0;

void characterCount(char ch, int list[])
		if (ch >= 'A' && ch <= 'z') //If the character is in the alphabet...
			int asciiCode = 0;
			asciiCode = static_cast<int>(ch); //Change it to the ASCII number
			list[asciiCode]++; //And note it on the array

void calcShift( int& shift, int list[])
	int maxIndex = 0, //Asuming that list[0] is the largest
		largest = 0;
		for (int i = 1; i < ARRAYSIZE; i++)
			if (list[maxIndex] < list[i])
					maxIndex = i; //If this is true, change the largest index

	largest = list[maxIndex]; //When the maxIndex is found, then that has the largest number.
		if (largest >= 65 && largest <= 90) //Calculate shift with E (for upper-case letters)
			shift = largest - 69;
		if (largest >= 97 && largest <= 122) //For lower-case letters (e)
			shift = largest - 101;

void writeOutput(ifstream &infile, ofstream &outfile, int shift)
	char ch;
	int asciiCode = 0;
		while (infile.peek() != EOF) { //Until it is the end of the file...
			infile.get(ch); //Get the next character
				if (ch >= 'A' && ch <= 'z') //If the character is in the alphabet...
					asciiCode = static_cast<int>(ch); //Change it to the ASCII number
					asciiCode += shift; //Do the shift
					ch = static_cast<char>(asciiCode); //Change it to the shifted letter
			outfile << ch; //Print to the outfile

Edited 6 Years Ago by charmed14: n/a

Stick some debugging code in there that displays things to the screen in order to verify that what you think is happening really is. Make sure that both the output and file and the input file are both opening and writable. Beyond that, display the value of ch both before and after line 109. If they aren't different, you've found your problem. If nothing is ever displayed, then your if-statement is never entered, and again, you have found your problem. Make sure you have a very small input file and that you know what the corresponding output file SHOULD be. If the debugging code shows that the correct shifting takes place, but the files still end up being incorrect, look carefully at the datestamps on the input and output files and make sure they are correct.

This doesn't solve your problem, but it's an APPROACH to solving the problem that may help you narrow it down.

This article has been dead for over six months. Start a new discussion instead.