Issue terminating for loop on conditional

I am having an issue trying to get a loop to terminate when there is not enough data in the array.

Source file is as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
6,9
3,5
4,5
-1
4,6
8,5
3,7
-1
9,3
8,2
7,5
5,8
-1
3,4
-1
4,6
8,3
1,7


The source code is:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <iostream> 
#include <vector>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
#define max_rows 3 
#define max_columns 2 
using namespace std; 


/*declare functions*/
int even (int Array[3][2], int length, int width);
void file();
void file2();
int row = 0;
void print();
int Array[max_rows][max_columns];
//Main Function
int main() 
{ 

	int Array[max_rows][max_columns]= {{3,2},{4,5},{2,2}}; 
	int counter;
	cout << "              Column    Column" << endl;
	for(int i=0; i<3; i++)    //This loops the rows.
	{
		cout<< "Row number:"<< row++ << " ";
		for(int j=0; j<2; j++) //This loops the columns
		{
			cout << "    "<< Array[i][j]  << "    ";
		}
		cout << endl;
	}

	cout<<"Total Even Numbers = "<< counter<< endl; 


	file();
	return 0; 

} 
//Print Function
void print(int Array[][max_columns], int length, int width, int counter)
{
	cout << "\tColumn\n\t";
	for (int i=0; i<width; i++){
		cout << i + 1 << "\t";
	}
	cout << "\n---------------------------------\n";
	for (int i=0; i<length; i++){
		cout << i+1 <<"|\t";
		for (int j=0; j<width; j++){
			cout << Array[i][j] <<"\t";
		}
		cout << endl;
	}
	cout << "The Number of Even numbers in array is " << counter << endl;
}





//Even Function
int even(int Array[][max_columns],int length, int width) 
{ 
	int counter; 
	for (length=0; length<3; length++) 
		for (width=0; width<2; width++) 
		{ 
			int even=Array[length][width]%2; 
			if(even==0) 
			{ 
				counter++; 
			} 
		} 
		return counter; 
}


//File read function parses comma's from source file and writes too a new temp file with only white space
void file() 
{

	ofstream outputFile("temp.txt");
	vector <vector <string> > data;
	ifstream infile( "inFilePgm2A.dat" );
	string line;
	string str;

	//  Read the file    
	while (getline(infile, line)) 
	{   
		istringstream ss (line);
		vector <string> record;

		while (getline(ss, str, ',')) 
			record.push_back(str);
		data.push_back (record);
	}
	//  Print the file without commas
	for (size_t i=0; i<data.size(); i++)
	{   
		vector <string>     record;

		record = data[i];
		//  Print each record
		for (size_t j=0; j<record.size(); j++)       
			outputFile << record[j] << " ";
		outputFile << endl;


	}
	file2();
}



//Second file manuipluation function takes the output from the file() function with commas removed and actually does the work with it
void file2()
{


	//int f;
	//int g;
	//int count;
	int minusone = -1;
	std::ifstream file;
	file.open("temp.txt");

	if(file.is_open())
	{

		//cout << "              Column    Column" << endl;
		while (true)
		{
			//	file >> minusone;
			if (minusone == -1){

				for(int i = 0; i < max_rows; i++)
				{
					for(int j = 0; j < max_columns; j++)
					{
						file >> Array[i][j];
						if (Array[i][j] == -1)
						{
							cout << "Too Few Values" << endl;
							goto toofew;
						}
						if (Array[i][j] < 0){
							cout << " Neg number exists" << endl;
						}
						if ( j > 3 ){
							cout << " Too much data" << endl;
						}
					}
				}


toofew:
				int count = even(Array, max_rows, max_columns);
				print(Array, max_rows, max_columns, count);
				cout << endl;



			}


			file >> minusone;
			if (file.eof())
				break;

		}

		file.close();

		remove ("temp.txt");


	}

}



Dirty I know, but it's mostly working. What I am having issues with is the part of the data file that has only one test condition between breaks

-1
3,4
-1

What that is supposed to do is print the line with 3 4
Total even = 1
Display an error message that there was not enough data, and then move onto the next set of test data. For some reason it's not clearing the array, so when it prints the array values in the next loop through they contain stale information, and the counting is all skewed.

The other issue i'm having is if there is more than 6 integers in the test condition it needs to print the 6 that fit, display an error message, and then continue processing with the next test condition.

If someone could compile this and see where i'm going wrong I would appreciate it.

Thanks
Last edited on
comments within the code, shout if something's unclear:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>

constexpr auto ROW = 3;
constexpr auto COL = 2;

struct MatRow
{
    int m_lhs = 0;
    int m_rhs = 0;

    MatRow(){}
    MatRow(const int& lhs, const int& rhs)
    : m_lhs(lhs), m_rhs(rhs){}
};
std::ostream& operator << (std::ostream& os, const MatRow& m)
{
    os << m.m_lhs << " , " << m.m_rhs << "\n";
    return os;
}
struct Matrix
{
    MatRow m_top;
    MatRow m_mid;
    MatRow m_bottom;
    Matrix(const MatRow& top, const MatRow& mid, const MatRow& bottom)
    : m_top(top), m_mid(mid), m_bottom(bottom){}
};
std::ostream& operator << (std::ostream& os, const Matrix& m)
{
    os << m.m_top << m.m_mid << m.m_bottom << "\n";
    return os;
}

int main()
{
    std::ifstream inFile("F:\\test.txt");
    std::vector<MatRow> rows{};
    int badRow{};
    if(inFile)
    {
        std::string line{};
        while(getline(inFile, line))
        {
            if(line.find(',') != std::string::npos)
            //presence of comma tells you if a line is good or not
            {
                std::string::size_type delim = line.find(',');
                std::string lhs = line.substr(0, delim);
                std::string rhs = line.substr(delim + 1);
                //split the line on the comma
                std::istringstream sstreamLHS(lhs);
                std::istringstream sstreamRHS(rhs);
                MatRow m{};
                sstreamLHS >> m.m_lhs;
                sstreamRHS >> m.m_rhs;
                if(inFile)
                {
                    rows.push_back(m);
                }
            }
            else
            {
                ++badRow;
            }
        }
    }
    if(badRow != 0)
    {
        std::cout << "The file had " << badRow << " row(s) of bad data \n";
    }
    for (const auto& elem : rows)
    {
        std::cout << elem ;
    }
    int matrixObjects = rows.size()/ROW;
    //integer division removes additional rows
    int unusedRows = rows.size() - matrixObjects * ROW ;
    std::cout << "Number of matrices possible: " << matrixObjects << '\n';
    std::cout << "There are " << unusedRows << " row(s) of unused data \n";
    rows.resize(matrixObjects * ROW);
    for (const auto& elem : rows)
    {
        std::cout << elem ;
    }
    std::vector<Matrix> vecMat{};
    std::cout << '\n';
    for (size_t i = 0; i < rows.size() - COL; i += ROW)
    {
        Matrix m(rows[i], rows[i+1], rows[i+2]);
        vecMat.push_back(m);
    }
    for (const auto& elem : vecMat)
    {
        std::cout << elem << '\n';
    }
}
Last edited on
Topic archived. No new replies allowed.