• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 447
  • Last Modified:

importing data into matrix (c++)

Hi experts.

novice c++ programmer here trying to do a pretty simple task.

I would like to read data in from a .txt and save it in a matrix that holds the same form.

I have tried working on this but is not pretty. attached is the code and the txt file.

the output should be the txt file without the -666666


#include <iostream>   // for input/output via screen
using namespace std;
#include <fstream>    // for input/output via files
#include <string>     // to enable data-type string
#include <cmath>          // for mathematical functions
#include <cstdlib>        //  -"-
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;

// This program reads values from the file 'example.txt'


int X[4][10];

int main()
{
   ifstream indata; // indata is like cin
   int num; // variable for input value

  indata.open("example.txt"); // opens the file
   if(!indata) { // file couldn't be opened
      cerr << "Error: file could not be opened" << endl;
      exit(1);
   }

int k = 0;
// Put it in the matrix X
  for(int i = 0; i < 11;i++){
	indata >> num;	
	if(num == -666666){
		k++;
		i=-1;
	}
	else{
		X[k][i] = num;
	}
	cout << num << endl;
   }
// Print the matrix out;

cout << "The data read in is: " << endl;
for(int l = 0; l < 4;l++){
	for(int j = 0; j<10;j++){
	cout << X[l][j] << " ";
	}
cout << endl;
}


  return 0;
}

Open in new window

1 2 3 4 5 6 7 8 9 4 -666666 
1 1 1 1 1 1 1 1 1 1 -666666 
2 2 2 2 2 2 2 2 2 2 -666666 
3 3 3 3 3 3 3 3 3 3 -666666

Open in new window

0
NAB015
Asked:
NAB015
  • 5
  • 5
2 Solutions
 
Infinity08Commented:
Are you sure you showed us the code that generates this output ?
0
 
NAB015Author Commented:
It does not yet generate the correct output. That is my problem.
Thanks for the quick response
0
 
Infinity08Commented:
Ah, I get it, the numbers are your txt file, not the output you get.

Looking at your code, there is the potential for an endless loop in the first for loop, because of this line :

>>             i=-1;

and the fact that you don't check for errors when reading from the file.

A minimal change to make your code work (better) would be to check for eof right after the indata >> num line :

        if (indata.eof()) break;

ie. end the loop if the end of the file is reached.


A better solution would be to use a nested loop (as well as proper error checking), rather than resetting the i loop counter.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
NAB015Author Commented:
Infinity,
I set i = -1 because the for loop then adds 1 bring it to 0 which is where I want it to store the next value X 0  i.

I know there is a really easy way to do this I just don't know C++ well enough to do it.
in pseudo code this would be ideal

for each line in document{ for each new line i++
     until the end of current line (counter for each value on line  j++
        save value into X
}
}







0
 
Infinity08Commented:
>> I set i = -1 because the for loop then adds 1 bring it to 0 which is where I want it to store the next value X 0  i.

I understand that.


>> I know there is a really easy way to do this I just don't know C++ well enough to do it.

I gave you an easy way of doing it by adding this one line :

      indata >> num;
        if (indata.eof()) break;          // <--- this line right here

Just to see if that fixes your problem.

If you can confirm it fixes your problem, below is something that would do what your pseudo code suggests. Note that you probably want to get rid of the -666666 values in the file, because you don't need them with the below code. Note also that the code doesn't check the boundaries of the X array, which is something that you should do to ensure there's no buffer overflow.
size_t i = 0, j = 0;

std::string line;
while (getline(indata, line)) {     // read the next line of data from the file, into a string
    j = 0;
    std::stringstream ss(line);     // a stringstream used for parsing the line
    int num = 0;
    while (ss >> num) {             // get the next int value from the line
        X[i][j] = num;              // and store it in the array
        ++j;
    }
    ++i;
}

Open in new window

0
 
NAB015Author Commented:
infinity thanks for you continued help.

now im getting this error and unfortunatly I don't know c++ well enough to try debugging this.

33: error: variable ‘std::stringstream ss’ has initializer but incomplete type

-NB
0
 
Infinity08Commented:
You'll need to add the include for std::stringstream :

        #include <sstream>
0
 
NAB015Author Commented:
Just tried that. I attached my code.
#include <iostream>   // for input/output via screen
#include <fstream>    // for input/output via files
#include <string>     // to enable data-type string
#include <cmath>          // for mathematical functions
#include <cstdlib>        //  -"-
#include <sstream>
using namespace std;
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::stingstream;

// This program reads values from the file 'example.txt'


int X[4][10];

int main()
{
   ifstream indata; // indata is like cin
   int num; // variable for input value

  indata.open("example.txt"); // opens the file
   if(!indata) { // file couldn't be opened
      cerr << "Error: file could not be opened" << endl;
      exit(1);
   }

size_t i = 0, j = 0;

std::string line;
while (getline(indata, line)) {     // read the next line of data from the file, into a string
    j = 0;
    std::stringstream ss(line);     // a stringstream used for parsing the line
    int num = 0;
    while (ss >> num) {             // get the next int value from the line
        X[i][j] = num;              // and store it in the array
        ++j;
    }
    ++i;
}


cout << "The data read in is: " << endl;
for(int l = 0; l < 4;l++){
	for(int j = 0; j<10;j++){
	cout << X[l][j] << " ";
	}
cout << endl;
}

  return 0;
}

Open in new window

0
 
NAB015Author Commented:
Thanks for the help!
You learn so much just by doing this.
0
 
Infinity08Commented:
Glad to have been of assistance :)
0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

  • 5
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now