I am having an issue with taking in an augmented matrix from a text file. The program will simply segfault after successfully reading in all of the data from the text file, most likely because it is still looking for another token to reach or fgets() isn't reaching a NULL state? I'm honestly lost...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "apmatrix.h"
#define NUMARGS 2
#define BUFSIZE 128
int main (int argc, char *argv[])
{
/* Matrices that will always be used */
Matrix* A;
Vector* b;
Vector* x;
iVector* p;
/* Used in LU factorization */
Matrix* L;
Matrix* U;
/* Standard character read-in variables needed */
char sep[] = " "; /* parsing separator is space */
char *z,*buffer; /* buffer and pointer to scan buffer */
FILE *ifp; /* source file */
unsigned buflen; /* length of line read */
int flag, count;
int Rows,Columns;/* to hold number read */
int CurrentRow=0;
/* first check to see if have required number for argc */
/* if not, error has occurred, don't do anything else */
if (argc == 2 || argc==3)
{
/* correct number of arguments used, try to open both files */
buffer = (char*) malloc(BUFSIZE); /* allocate buffer */
ifp = fopen (argv[1], "r"); /* open file for reading */
if (ifp && buffer) { /* if successful proceed */
/* read file line by line */
flag=0;
while (fgets(buffer, BUFSIZE, ifp) != NULL) {
/* defensive/secure programming */
buflen = strlen(buffer);
/* parse line */
z = strtok(buffer,sep);
/* take in the values of the rows and columns */
if(flag == 0){
++flag; /* Flag = 1 */
Rows = atoi(z); /* Convert the string to double */
printf(" %d",Rows);
z = strtok(NULL, sep); /* find next number */
Columns = atoi(z); /* Convert the string to double */
printf(" %d",Columns);
putchar('\n');
A = m_alloc(Rows,Columns);
b = v_alloc(Rows);
x = v_alloc(Rows);
p = iv_alloc(Rows);
L = m_alloc(Rows,Columns);
U = m_alloc(Rows,Columns);
}
/* take in the values of the matrices */
else{
for(int i = 0; i < Rows; i++){
A->mat[CurrentRow][i] = (Real) atof(z); /* Convert the string to an int*/
z = strtok(NULL, sep); /* find next number */
printf(" %2.3f ",A->mat[CurrentRow][i]);
}
b->vec[CurrentRow] = (Real) atof(z); /* Convert the string to an int */
printf(" %2.3f ",b->vec[CurrentRow]);
putchar('\n');
CurrentRow++;
putchar('\n');
}
}
fclose (ifp);
...
I didn't print the rest of my code because I just do not see it as relevant to the question at hand. I want to know why this problem is occurring and how I could fix it in code, because I will need the information to solve for Ax=b later on in the program. The text file gives me the augmented matrix [A|b] and so I solve for x using LU factorization. I think it might have to do with the buffer itself, but I'm also inexperienced with C programming.
Also the text file I am reading is written as such...
3 4
2 1 1 1
6 2 1 -7
-2 2 1 7
These are the results I get from the code
3 4
2.000 1.000 1.000 1.000
6.000 2.000 1.000 -7.000
-2.000 2.000 1.000 7.000
Segmentation fault (core dumped)
Thank you for your time. :)
UPDATE: I tried running gdb to debug and I've been stuck on trying to run the core dump with a text file. (ex. ./hw6 ge1.txt is what I would type into the command line). How do I run this with the text file, because it is segfaulting without it.
c
Continuing.
Expecting two or three arguments
The second argument must be a text file to read from.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a4e in m_free (M=0x0) at apmatrix.c:32
32 free(M->mat[0]); /* free data */