NAB015
asked on
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
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;
}
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
Are you sure you showed us the code that generates this output ?
ASKER
It does not yet generate the correct output. That is my problem.
Thanks for the quick response
Thanks for the quick response
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.
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.
ASKER
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
}
}
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
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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
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
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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;
}
ASKER
Thanks for the help!
You learn so much just by doing this.
You learn so much just by doing this.
Glad to have been of assistance :)