Ok, something very wrong is going on with my program. When i run it the numbers it is giving me are sometimes right but are also wrong. H (the first letter in the word) is both = to 0 and 1 (wtf?). Any ways below i'll show you want i should be getting and what i am getting.
Book File (12 characters) Hello world!
Message File (12 characters) Hello world!
Out File (generated from the encoder, should be 12 numbers) 0 1 2 3 4 5 6 7 8 9 10 11
when the out file is decoded it should be the same as the message file.
this is what I'm getting:
Book File (12 characters) Hello world!
Out File (generated from the encoder, should be 12 numbers) 1 3 9 7 5 6 7 9 10 11
when decoded this comes out to: Hlrwo wrldd
please help me find out whats causing this problem!
Below is my code for each program.
ENCODER
#define _CRT_RAND_S
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cmath>
using namespace std;
int getSize (istream& file)
{
int num = 0;
char c =file.get();
while (file)
{
++num;
c = file.get();
}
return num;
}
int random(int low, int high)
{
unsigned num;
rand_s(&num);
double normalized = static_cast<double>(num) / UINT_MAX;
return static_cast<int>(normalized * (high - low +1)) + low;
}
int main(int argc, char *argv[])
{
if (argc != 4)
{
cout << "Usage: encode.exe bookFile.txt msgFile.txt outFile.txt" << endl;
}
else
{
ifstream bookIn(argv[1]);
ifstream msgIn(argv[2]);
ofstream out(argv[3]);
vector<char> msgVector;
while (msgIn)
{
msgVector.push_back(msgIn.get());
}
msgIn.clear();
msgIn.seekg(0, ios::beg);
//count number of chars in the book file and set the char size
int bookSize = 0;
int msgSize = 0;
msgSize = getSize(msgIn);
msgIn.clear();
msgIn.seekg(0, ios::beg);
bookSize = getSize(bookIn);
bookIn.clear();
bookIn.seekg(0, ios::beg);
int startingPoint = 0;
char c = bookIn.get();
for (int i=0; i < msgSize; ++i)
{
bookIn.clear();
bookIn.seekg(0, ios::beg);
//select a random number from the generator
startingPoint = random(0,bookSize);
//go to that number in the book
for (int ii=0; ii < startingPoint; ++ii)
{
c = bookIn.get();
}
cout << "Random number is: " << startingPoint << endl;
cout << "msgVector is: " << msgVector[i] << endl;
cout << "c is: " << c << endl;
//find the next char that is = to the char of the msg
for(int ii=startingPoint; ii < bookSize; ii++)
{
c = bookIn.get();
cout << "\nc is: " << c << endl;
cout << "ii is at: " << ii << endl;
cin.ignore();
if (msgVector[i] == c)
{
//print number of char in bookFile to outFile, print a space before next char.
out << ii << " ";
break;
}
else if (ii == (bookSize-1))
{
cout << "No character found" << endl;
--i;
ii=0;
break;
}
}//end for
}//end for
}//end stream
cin.ignore();
return 0;
}//end main
DECODER
#define _CRT_RAND_S
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(int argc, char *argv[])
{
if (argc != 4)
{
cout << "Usage: decode.exe bookFile.txt codedFile.txt outFile.txt" << endl;
}
else
{
ifstream bookIn(argv[1]);
ifstream codeIn(argv[2]);
ofstream out(argv[3]);
int temp;
vector<int> codedNum;
while (!codeIn.eof())
{
codeIn >> temp;
codedNum.push_back(temp);
}
codeIn.clear();
codeIn.seekg(0, ios::beg);
//for(int i=0; i < codedNum.size(); ++i)
//cout << codedNum[i] << endl;
int num = 0;
char c = bookIn.get();
//bookIn.clear();
//bookIn.seekg(0, ios::beg);
for(int i=0; i < codedNum.size(); ++i)
{
bookIn.clear();
bookIn.seekg(0, ios::beg);
num = 0;
while (num != codedNum[i])
{
c = bookIn.get();
++num;
}
out << c;
cout << "num is: " << num << endl;
cout << "letter is: " << c << endl;
}//end for
}//end stream
cin.ignore();
return 0;
}//end main