OK, my code is very long. But this one is a little tricky so just bare with me here guys.
What my program does is generate a text file with random numbers, for eg:
123
1234
12345
123456
And the program takes in that file and puts the random data into a struct array.
It then processes the array and outputs a file that looks like this:
outfile.txt produced based in the above infile.txt:
No Type Odd Even Sum Digit
1234 Even 2 2 10 4
23467 Odd 2 3 22 5
123 Odd 2 1 6 3
But the problem I'm running into is that everything comes out fine and as intended, except that my odd/even count stops working on the every other line! For instance, the first line, it would output the correct results, the second line it wouldn't, the third line it would work again and so on.
Here is the code in it's entirety.
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
const int MAX = 100;
enum NumType {Odd, Even};
struct Number
{
int no;
NumType type;
int oddDigits;
int evenDigits;
int sumDigits;
int noDigits;
};
void arrayToOutfile (ofstream&, char [], Number [], int);
void constructInfile (fstream&, char []);
int constructArray (fstream&, char [], Number []);
void processArray (Number [], int);
NumType whatType (int);
void getStringLabel (NumType, char []);
int main ()
{
srand (time_t(NULL));
fstream inFile;
char fileName [MAX];
cout << "Enter filename: ";
cin >> fileName;
constructInfile (inFile, fileName);
cout << "----------------------------------------" << endl;
Number n [MAX];
int size = constructArray(inFile, fileName, n);
processArray (n, size);
cout << "----------------------------------------" << endl;
ofstream outFile;
cout << "Enter the output filename: ";
cin >> fileName;
arrayToOutfile (outFile, fileName, n, size);
}
//Generate random integers into a new text file.
void constructInfile (fstream& inFile, char fileName[])
{
inFile.open (fileName, ios::out);
if (!inFile)
{
cout << fileName << " cant be created for write"
<< endl;
exit (-1);
}
int size = rand() % 51+ 50;
for (int i = 0; i < size; i++)
{
inFile << rand () % 901 + 100 << endl
<< rand () % 90001 + 10000 << endl
<< rand () % 900001 + 100000 << endl;
i++;
}
cout << "written to outfile successfully" << endl;
inFile.close();
}
//Make the array from the data input text file.
int constructArray (fstream& inFile, char fileName[], Number n[])
{
inFile.open (fileName, ios::in);
if (!inFile)
{
cout << fileName << " cant be accessed for array creation."
<< endl;
exit (-1);
}
cout << "Begin file to array" << endl;
int i = 0;
while (inFile >> n[i].no)
{
++i;
}
inFile.close();
cout << "File to array transfer success" << endl;
return i;
}
//Process the array and the data inside of it.
void processArray (Number n [], int size)
{
cout << "Begin processing array" << endl;
//Odd or Even Enum Label
for (int i = 0; i < size; i++)
{
n[i].type = whatType (n[i].no);
}
int countEven = 0;
int countOdd = 0;
//copy number n array to temp n array
Number t [MAX];
for (int i = 0; i < size; i++)
{
t[i].no = n[i].no;
}
for (int i = 0; i <size; i++)
{
n[i].evenDigits = 0;
n[i].oddDigits = 0;
}
//oddcount, evencount. (WORKS, BUT ONLY EVERY OTHER LINE)
for (int i = 0; i < size; i++)
{
while (t[i].no > 0)
{
if (t[i].no % 2 == 1)
{
countOdd++;
t[i].no/= 10;
}
else
{
countEven++;
t[i].no/=10;
}
n[i].oddDigits = countOdd;
n[i].evenDigits = countEven;
} i++;
countEven = 0;
countOdd = 0;
}
//copy number n array to temp n array again.
for (int i = 0; i < size; i++)
{
t[i].no = n[i].no;
}
//Sum digits (WORKS!!!)
//SET TO DEFAULT 0 FOR SUMDIGITS
for (int i = 0; i <size; i++)
{
n[i].sumDigits = 0;
}
for (int i = 0; i < size;)
{
while (t[i].no > 0)
{
n[i].sumDigits = n[i].sumDigits + t[i].no % 10;
t[i].no /= 10;
}i++;
}
//copy number n array to temp n array again.
for (int i = 0; i < size; i++)
{
t[i].no = n[i].no;
}
//SET TO DEFAULT 0 for COUNT DIGITS
for (int i = 0; i <size; i++)
{
n[i].noDigits = 0;
}
//DIGIT COUNT
for ( int i = 0; i < size; i++)
{
int countDigits = 0;
while (t[i].no != 0)
{
t[i].no /= 10;
countDigits++;
}
n[i].noDigits = countDigits;
}
for (int i = 0; i < size; i++)
{
}
cout << "The array was processed" << endl;
}
//Enumerated Number type.
NumType whatType (int n)
{
if (n % 10 % 2 == 1)
return Odd;
else
return Even;
}
//From Array to Outfile.
void arrayToOutfile (ofstream& outFile, char fileName[], Number n[], int size)
{
outFile.open (fileName);
if (!outFile)
{
cout << "Array to " << fileName << " failed" << endl;
exit (-1);
}
cout << "Begin from array to " << fileName << endl;
cout << fixed << showpoint << setprecision (3);
char label [MAX];
outFile << "No" << "\t"
<< "Type" << "\t"
<< "Odd" << "\t"
<< "Even" << "\t"
<< "Sum" << "\t"
<< "Digit"
<< endl;
for (int i = 0; i < size; i++)
{
getStringLabel (n[i].type, label);
outFile << n[i].no << "\t"
<< label << "\t"
<< n[i].oddDigits << "\t"
<< n[i].evenDigits << "\t"
<< n[i].sumDigits << "\t"
<< n[i].noDigits << endl;
}
outFile.close();
cout << "Array to outfile OK" << endl;
}
//Enumeration String label
void getStringLabel (NumType type, char label[])
{
switch (type)
{
case Odd: strcpy (label, "Odd");
break;
case Even: strcpy (label, "Even");
break;
default: strcpy (label, "err");
}
}
I believe however that there is a problem with this section that I haven't figured out how to fix.
//oddcount, evencount. (WORKS, BUT ONLY EVERY OTHER LINE)
for (int i = 0; i < size; i++)
{
while (t[i].no > 0)
{
if (t[i].no % 2 == 1)
{
countOdd++;
t[i].no/= 10;
}
else
{
countEven++;
t[i].no/=10;
}
n[i].oddDigits = countOdd;
n[i].evenDigits = countEven;
} i++;
countEven = 0;
countOdd = 0;
}
Guys, yes I know the code is very unstructured and messy especially in the processing array function -- I will tend to cleaning everything up soon but first, your professional input on why this is happening would be appreciated.
-Ace