Text file reading problem

I've got a problem regarding reading a text file.

I have a text file which is this format:

3 2 3 4
-3 1 1
1 -3 0
1 0 -4
-5 -5 0

Basically, first line has 4 numbers (each representing a specific variable values - the first nubmer which is 3, represents the dimension of the matrix), then second line through 4th line is a matrix (3 by 3 matrix), then the last line is the right-hand-side of that matrix. Thus I should be able to solve this linear equations eventually.

The problem comes from reading this file. At the moment I've got it so that:

int *indx, s, d, ns;
int num, job=0, job2=0;
double p, **aa ;
double *x;
double sum;
ifstream infile;
string line2;
char * inname = "matrix.txt";
infile.open(inname);

if (!infile) {
cout << "Cannot open file " << inname << " for reading." << endl;
exit(EXIT_FAILURE);
}

infile >> dim >> ns >> s >> d; //Reads the first line (4 variables)
for (i = 1; i <= dim; i++) {
for (j = 1; j <= dim; j++) {
if (!(infile >> a[i][j])) {
cout << "Couldn't read a[" << i << "][" << j << "]" << endl;
exit(EXIT_FAILURE);
}
aa[i][j] = a[i][j];
}
}
.
.
.
other stuff
.
.
.


This results in the exit always (end up with the "couldn't read a[1][1]" error message).
I think the problem is that it doesn't go to the next line after reading the first 4 variables, and i'm sure there's an easy way of fixing this problem but my head is blank at the moment.

Someone please help?
Last edited on
Where is A declared? Have you allocated memory for it?
Last edited on
It is declared else where as:

double **a;
a = dmatrix(1, dim, 1, dim);
But you read from the file to dim value here. You can't use the dim before it...
Also you didn't allocate any memory for **aa
Last edited on
Oh it is read again in "matrix.txt" file...
The thing is that dim value updates as it is looped.
Thus I need to read in new updated-dim value everytime.

It is read first in a another file called "contour.txt", then it uses that dim value to decalre "a".
Then this function I put up above comes in later (with new dim value).
Sorry, I actually do but just left it out.

[source]
indx = ivector(1, dim); /* holds pivot info from ludcmp for lubskp
aa = matrix(1, dim, 1, dim); /* a copy of the matrix to send to ludcmp
x = vector(1, dim); /* Copy rhs to x and send to lubksp */
[/source]

The code is really lengthy so thus I didn't bother putting up the whole thing.
Last edited on
I don't know about matrix... I can't find anywhere the dmatrix() function...
I'll post an example on how to do the same thing with new() instead of dmatrix():
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
#include <iostream>
#include <fstream>
using namespace std;
int main(){
   int dim, ns, s, d;
   double **matr;
   char * inname = "matrix.txt";
   ifstream infile(inname);

   if (!infile) {
      cout << "Cannot open file " << inname << " for reading." << endl;
      exit(EXIT_FAILURE);
   }
   infile >> dim >> ns >> s >> d; //Reads the first line (4 variables)
   //Create the array
   matr = new double*[dim];
   for(int i=0; i<dim; i++){
      matr[i] = new double[dim];
   }
	
   //Read from file to array
   for(int i=0; i<dim; i++){
      for(int j=0; j<dim; j++){
         infile >> matr[i][j];
      }
   }
   //Previewing the array
   for(int i=0; i<dim; i++){
      for(int j=0; j<dim; j++){
	      cout <<  matr[i][j] << ' ';
      }
      cout << '\n';
   }
   //Deleting contents
   for(int i=0; i<dim; i++){
      delete [] matr[i];
   }
   delete [] matr;
}


You can put together the first to for-loops so you won't do the same loop twice.

Anybody who knows better about it can help you more. This is just how I would do it.
Last edited on
Thanks, I'll see what I can do with this.
It's end of the day so I might try it out tomorrow morning.
Could you check back again around tomorrow noon to see if I have any question?
I'll let you know how it went.

Thanks.
sure, no problem
i think the problem is

if (!infile) {
cout << "Cannot open file " << inname << " for reading." << endl;
exit(EXIT_FAILURE);
}

i think infile is an object so it will not = false or null :D

and as u said the program allows extining ithink that is the error

I think you are absolutely right shereif102...
infile is an object!

and thanks to you as well Mitsakos , I think your approach seems to be working.

Thanks for the help everyone, despite me putting up insufficient information regarding the code.
The if(!infile) works fine. But if you want to be completely accurate you can use:
 
if(!infile.is_open()){}

The is_open() returns true if the file is open and false otherwise.

[EDIT]
The infile is a stream. When trying to open the file it will have some contents (different than 0) so it will act as a True in the if.
If it returns an error then it is gonna have the value of 0 which is also a value for the False value.
Last edited on
Topic archived. No new replies allowed.