# Thread: Determing the maximum number (coordinate) from imput file

1. ## Determing the maximum number (coordinate) from imput file

Hey.
I need some help with C or C++. I am a beginer, so the code might be weird.

I have to import a file.txt with real E notated (like 2.3E-12) numbers in 2 columns in it (coordinates basicly - x and y) in to C or C++ (does not matter which, I am learning both). Then I have to determine the maximum number from the second column (y) and then write out the full apropriate coordinate (x, max. y).

I managed to find out the max. y, coordinate in case I have integer numbers, the problem is I need it for real numbers, which are quite big: up to E+-30.

Another problem is the number of lines (or buffer). There are approx. 70000 - 600000 rows in the columns, so 70000 values, from which I have to find the max. (or min.).

This is the code, but only works for Integers (I still have to make it output both coordinates):
Code:
```       #include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

int matrix[70000][2];

int main () {
ifstream inFile;
inFile.open("input.txt");

if (!inFile) {
cout << "Unable to open file";
exit(1);
}

int numRows = 0;
int max = matrix[0][1];
int min = matrix[0][1];

while (inFile >> matrix[numRows][0]) {

inFile >> matrix[numRows][1];

if (matrix[numRows][1] > max){
max = matrix[numRows][1];
}
else if (matrix[numRows][1] < min){
min = matrix[numRows][1];
}

numRows++;
}
printf ("Maximum element in an array : %d\n", max);
printf ("Minimum element in an array : %d\n", min);

inFile.close ();
}```
I guess you cannot import real numbers as easy as integers? Or is there a quick fix to above code? The code works for int, and has not been tested with larger number of lines.

And this code bellow, I found on the net and modified (I still have to make it read from the secound coloumn, I guess the same way as for integers?), but I guess the buffer size is the problem here, it only works for small number of rows (for example, if I leave only 100 lines in input.txt, it works fine)?, for larger number of lines (10000 numbers or more) runing this program in cmd (windows) returns an error like: "...program.exe has encountered a problem and needs to close..." :

Code:
```#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

int main()
{
double largestNum, smallestNum;
float values[9725];
double sum = 0;         // holds total of all numbers
char buffer[9725][9725];      // character arrays store numbers in "doubles.txt"
int count = 0;

ifstream file;
file.open("doubles.txt");

while(!file.eof())             // reads "doubles.txt" until end of file
{
file.getline(buffer[count],9725,'\n');   // reads line by line to buffer[]
values[count] = atof(buffer[count]);      // converts char buffer[] to float values[]
//sum += values[count];            // adds all numbers from values[]
count++;
}

largestNum = values[0];    // seeding largestNum with first value
smallestNum = values[0];   // seeding smallestNum with first value

for(count=0;count<9725;count++)
{
if(values[count] < smallestNum)     // compares smallestNum to values[]
smallestNum = values[count];  // new smallestNum stored here
if(values[count] > largestNum)      // compares largestNum to values[]
largestNum = values[count];   // new largestNum stored here
}

cout << " Largest : " << largestNum << endl; // prints largest number
cout << "Smallest : " << smallestNum << endl;   // prints smallest number
// cout << " Average : " << sum / 25 << endl;   // prints average

system("pause");
return 0;
}```

The imput.txt files I will need to read are like this bellow (for the second code I used only secound column, for the first code I used simple integer two coulumn test file), just with the extra 520 000 lines..it is quite big, 12Mb:

15894.6 6.00085E-13
31789.1 7.21448E-13
47683.7 7.32097E-13
63578.3 6.43489E-13
79472.9 5.90027E-13
95367.4 7.74707E-13
111262 5.11338E-13
127157 7.45003E-13
143051 6.44474E-13
158946 4.85771E-13
174840 8.93456E-13
190735 7.39305E-13
206629 8.06542E-13
222524 8.5784E-13
238419 7.12852E-13
254313 4.8251E-13
270208 6.47216E-13
286102 7.0523E-13
301997 7.24186E-13
317891 5.6712E-13

Is there any other simple way, other than programing (In case the buffer size is to big problem here) to find out the maximum and minimum, any idea?
Any help appreciated and Thanks in advance!

2. I guess you cannot import real numbers as easy as integers? Or is there a quick fix to above code? The code works for int
your file contains floating point numbers, when you test the size of them you are reading them into an array that is declared as storing int values, would this make sense to you?

dunno if i am reading your stuff right tho, not sure what you on about

3. Hey, rogster0001

The first code pasted above was not used with floating point numbers, just with intigers, for example:

1 2
3 5
6 3
5 6
2 6

And yes, it declares int values and is working for inputing int numbers only (not for the file that contains floating point numbers) - it was just a test if it would work that way, to start things easier...

The problem is, that I am not able to make that code to read the floating point numbers (instead of int numbers) into an array that would be declared as storing floating point numbers... Just renaming "int" into "float" or "double" does not work... Program returns starting value, 0.

So the q. are:
1) I guess you have to store floating point numbers into char and then convert char buffer to float values, like is done in the 2. example code? But is this the only way (or is it possible to "repair" the 1. code, which I find simpler)?

2) I do not know, what should be done with the 2. code, so it would not crash when run. It compiles ok, even works ok with small sample of rows. For example, if you take just this numbers from second coulmn:

6.00085E-13
7.21448E-13
7.32097E-13
6.43489E-13
5.90027E-13
7.74707E-13
5.11338E-13
7.45003E-13
6.44474E-13
4.85771E-13
8.93456E-13
7.39305E-13
8.06542E-13
8.5784E-13
7.12852E-13
4.8251E-13
6.47216E-13
7.0523E-13
7.24186E-13
5.6712E-13

...it does the job fine! But it cannot read all 70 000 - 700 000 lines without crashing. So the question: Is this buffer problem and how to solve it?

Any idea would do, even a non-programing solution to finding the maximum y coordinate.

4. ## Stack

Its system specific and i am no expert on this but you could be overflowing the stack yes, you can use malloc in c dunno bout cplus, i had similar prob recently but with much bigger array if i rem correct,try reducing your array size gradually to see fail

5. I think the question you should be asking yourself is:

If I just have to find the largest and the smallest value, do I have to store all the values in memory?

6. If I just have to find the largest and the smallest value, do I have to store all the values in memory?
I guess not, I just need to got through the file and check it simultaniously, what I think the first code above is doing. I dont know any other way to do it, do you?

7. If you think that's what the code is doing, why do you keep all the old values in an array in memory? And yes I can think of a way of doing this, it's more or less the same as yours, just without the storing ALL the values part.

8. So this is what I have now, but I can`t make it read doubles. How should I use "ifstream:perator<<(double)"? I tried several times, but does not compile. Also, I am not sure if this code would run with the full input file, having 70 000 - 500 000 rows of numbers, I guess there is no reason it shouldn`t?

Like this, it returns 0 (initial values are not the problem, I think, in my oppinion import should be read correctly), when run with testing 2 column double numbers.

Code:
```        #include <iostream>
#include <fstream>
#include <cstdlib>
#include <limits.h>
using namespace std;

double matrix[70000][2];

int main () {

ifstream inFile;
inFile.open("input.txt");
//how to make it read double?
//ifstream::operator<<(double) inFile does not compile...

if (!inFile) {
cout << "Unable to open file";
return 0;
}

int numRows = 0;
double min = INT_MAX;
double max = INT_MIN;

while (inFile >> matrix[numRows][0]) {
//  reads the first column, x values

inFile >> matrix[numRows][1];
//  and reads the coresponding y values (to x)

//from y values read, it determines max y and min y

if (matrix[numRows][1] > max){
max = matrix[numRows][1];
}
else if (matrix[numRows][1] < min){
min = matrix[numRows][1];
}

numRows++;
printf ("\n");
}
printf ("Maximum element in an array : %d\n", max);
printf ("Minimum element in an array : %d\n", min);

inFile.close ();
return 0;
}```
JacobN, maybe an example of what you have in mind?

I am a beginner, so this is the simples way, I can think of - to read the values. How to flush them out of memmory? No idea. If I use:

while(!file.eof())
{ ....and in it the loop } is probably the same. What I meant was that using buffer like in secound code example posted is unneccessary...

9. Alright, I have something like this:
Code:
```#include <iostream>
#include <limits>
#include <fstream>

int main( void )
{
std::ifstream input( "input.txt" );

if( !input )
{
std::cout<<"Unable to open file.\n";
return 1;
}

double in[2]  = { 0.0, 0.0 };
double max[2] = { 0.0, std::numeric_limits<double>::min() };
double min[2] = { 0.0, std::numeric_limits<double>::max() };

while( input>>in[0]>>in[1] )
{
if( in[1] > max[1] )
{
max[0] = in[0];
max[1] = in[1];
}
else if( in[1] < min[1] )
{
min[0] = in[0];
min[1] = in[1];
}
}

std::cout<<"Maximum element in the file is: ("<<max[0]<<","<<max[1]<<")\n";
std::cout<<"Minimum element in the file is: ("<<min[0]<<","<<min[1]<<")\n";

return 0;
}```
(If some admin thinks it's too much help then go ahead and remove it)

But basically, I just keep the largest and the smallest value in a value, read the next coordinate into a variable, compare and assign as needed.

The lines:
Code:
```double max[2] = { 0.0, std::numeric_limits<double>::min() };
double min[2] = { 0.0, std::numeric_limits<double>::max() };```
Simply initalizes the max and min arrays to the maximum and minimum values that can be contained in a double.

10. Quick response!

Will have a look in the code, looks interesting (I guess I will not understand some parts from the start). Thnx!

11. ## Step back

Its not the code but the concept you should be thinking over, as suggested forget storing whole file and just evaluate each entry against last highest or lowest found, you could maintain an array 4 max, min, mean, median values, and do sort 4 mode too

12. Hey!
Yes, I get the point, this code does exactly what I was talking about, without storing all values:
""If I just have to find the largest and the smallest value, do I have to store all the values in memory?"
"I guess not, I just need to got through the file and check it simultaniously...""
Elegantly done! Kudos to JacobN!

If I understand it correct, the main difference is here:

double in[2] = { 0.0, 0.0 };
//just storing the 2 values (x and coresponding y), instead of "double matrix[70000][2];"

I have a question though. In "for { }" loops/statements you have to put: i++ (or numRows++
in my code above for example) so program is running value by value from 0 to max value, I guess that is not necessary for "while { }" statements? Or is it missing here (works perfectly well without it, so maybe I just missed sth.):
Code:
```while( input>>in[0]>>in[1] )
{
if( in[1] > max[1] )
{
max[0] = in[0];
max[1] = in[1];
}
else if( in[1] < min[1] )
{
min[0] = in[0];
min[1] = in[1];
}
}```
Thnx, Q.

13. The while-loop relies on the state of the "input" ifstream object, if it has reached the end of the file(or if there somehow was an error while reading i suppose) it will break out of the loop.

Popular pages Recent additions