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

Recommended Answers

All 2 Replies

Search on Google Array loop.

Thanks for the obvious and really unhelpful answer simrankin. You dont think i've already tried googling for answers before I made the effort to type my post out here in the forum? Zero points to you.

Besides, I've already figured out what was wrong with it. There are i++ counters in my for loop which made it skip +2 every time it counted.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.