-
File I/O with 2D arrays
This is a program to read in a file of 2D arrays. I have gotten the code to work (option 1) but whenever I change the input file to 3 by 3, it stops working. Any idea why? Tks
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STR_LENGTH 255
typedef struct {
int rows;
int cols;
int** element;
} matrix;
void displayMenu(void);
void addMatrix(char *filename, matrix *matrices, matrix *resMatrix);
int readMatrix(char *filename, matrix *matrices, int num);
void freeMalloc(matrix *matrices, int num);
int main(void){
int choice, n;
char inputBuffer[MAX_STR_LENGTH], filename[MAX_STR_LENGTH];
matrix matrices[2];
matrix resMatrix[1];
do{
displayMenu();
do{
gets(inputBuffer);
n = sscanf(inputBuffer, "%d", &choice);
}while (n != 1);
puts("");
switch(choice){
case 1:
puts("System >> Enter matrices for addition operation:");
printf("User >> ");
fflush(stdin);
gets(inputBuffer);
sscanf(inputBuffer, "%s", filename);
addMatrix(filename, matrices, resMatrix);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
puts("Please enter a choice from 1 to 5.");
}
}while(choice != 5);
puts("Exiting Program ... ...");
freeMalloc(matrices, 2);
return 0;
}
void displayMenu(void){
puts("");
puts("Welcome to simple matrix program.");
puts("Please select an option.");
puts("");
puts("(1) Add two matrices");
puts("(2) Subtract two matrices");
puts("(3) Multiplication of two matrices");
puts("(4) Assign a matrix to another");
puts("(5) Exit");
puts("");
printf("Your choice: ");
}
int readMatrix(char *filename, matrix *matrices, int num){
int read, orders = 1;
int i, j, rows, cols;
char inputBuffer[MAX_STR_LENGTH];
FILE *fp;
if ((fp = fopen(filename, "r")) != NULL){
for (read = 0; read < num; read++) {
do {
fgets(inputBuffer, MAX_STR_LENGTH, fp);
} while(strstr(inputBuffer, "<matrix>") == NULL);
fgets(inputBuffer, MAX_STR_LENGTH, fp);
matrices[read].rows = rows = atoi(strchr(inputBuffer, '=') + 2);
fgets(inputBuffer, MAX_STR_LENGTH, fp);
matrices[read].cols = cols = atoi(strchr(inputBuffer, '=') + 2);
matrices[read].element = (int**) malloc(sizeof(int) * rows);
printf("System >> Displaying matrix %d\n", orders);
orders++;
for (i = 0; i < rows; i++) {
matrices[read].element[i] = (int*) malloc(sizeof(int) * cols);
for (j = 0; j < cols; j++) {
fscanf(fp, "%d", &matrices[read].element[i][j]);
printf("%d ", matrices[read].element[i][j]);
}
printf("\n");
}
do {
fgets(inputBuffer, MAX_STR_LENGTH, fp);
} while (strstr(inputBuffer, "</matrix>") == NULL);
}
}
else {
printf("%s do not exist!", filename);
puts("");
return orders;
}
fclose(fp);
return orders;
}
void freeMalloc(matrix *matrices, int num) {
int current, i;
for (current = 0; current < num; current++) {
for (i = 0; i < matrices[current].rows; i++)
free(matrices[current].element[i]);
free(matrices[current].element);
}
}
void addMatrix(char *filename, matrix *matrices, matrix *resMatrix){
int i, j, rows, cols;
if (readMatrix(filename, matrices, 2) != 1){
resMatrix[0].rows = rows = matrices[0].rows;
resMatrix[0].rows = cols = matrices[0].cols;
puts("System >> Displaying resultant matrix after addition");
resMatrix[0].element = (int**) malloc(sizeof(int) * (rows+1));
for(i = 0; i < rows; i++){
if (i != 0) printf("\n");
for(j = 0; j < cols; j++){
resMatrix[0].element[i][j] = (matrices[0].element[i][j] +
matrices[1].element[i][j]);
printf("%d ", resMatrix[0].element[i][j]);
}
}}
}
The 2 by 2 array file matrix2-2.txt
Code:
<matrix>
rows = 2
cols = 2
1 2
1 2
</matrix>
<matrix>
rows = 2
cols = 2
2 3
2 3
</matrix>
The 3 by 3 array file matrix3-3.txt
Code:
<matrix>
rows = 3
cols = 3
1 2 3
1 2 3
1 2 3
</matrix>
<matrix>
rows = 3
cols = 3
2 3 4
2 3 4
2 3 4
</matrix>
-
Firstly, do a board search on gets() and fflush(stdin) and read about why you shouldn't use them.
Secondly, you didn't state what the problem was, i.e. what doesn't work, or what happens that's not supposed to.
-
3 X 3 Problem
Not that I understand all of the intricasies of your code but it appears to me that the only problem with it is that in your call to the read_matrix function in the add_matrix function, you have the number of rows to read hardcoded to be 2. This number should be changed to accept the number of rows desired and in your case should be changed to 3.