Why does my program crash when I introduce arithmetic operations involving arrays? - c

The purpose of the program I'm developing is to get data from two different files, perform mathematical operations involving these data, and then store the results in another file. The number of lines is counted in order to perform further calculations such as averages etc. Everything is working fine when no arithmetical operations are include. For instance, the following program successfully opens the files, reads them, allocates memory for the data, stores them into these arrays, prints the arrays contents in order to verify if the data are there, and then writes the data to another file:
#include <stdio.h>
#include <stdlib.h>
int main()
{
float *VarA;
float *VarB;
int n = 0;
int m = 0;
int i;
FILE *input1;
FILE *input2;
FILE *output;
input1 = fopen("C:\\...\\test.txt","r");
if (input1 == NULL)
{
printf("Error! Could not open input 1.\n");
exit(1);
}
else
printf("Input1 opening: OK.\n");
input2 = fopen("C:\\...\\test2.txt","r");
if (input2 == NULL)
{
printf("Error! Could not open input 2.\n");
exit(1);
}
else
printf("Input2 opening: OK.\n");
while(fscanf(input1,"%f") == 1)
n++;
rewind(input1);
printf("n = %i\n", n);
while(fscanf(input2,"%f") == 1)
m++;
rewind(input2);
printf("m = %i\n", m);
if(m != n)
{
printf("Error: Number of rows does not match!\n");
exit(1);
}
else
printf("Number of rows matches.\n");
VarA = calloc(n, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarA.\n");
exit(1);
}
VarB = calloc(m, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarB.\n");
exit(1);
}
for(i = 0; i < n; i++)
fscanf(input1,"%f",&VarA[i]);
fclose(input1);
for(i = 0; i < m; i++)
fscanf(input2,"%f",&VarB[i]);
fclose(input2);
for(i = 0; i < n; i++)
{
printf("VarA: %f\n",VarA[i]);
printf("VarB: %f\n",VarB[i]);
}
output = fopen("C:\\...\\out.txt","w");
if (output == NULL)
{
printf("Error! Could not open output.\n");
exit(1);
}
else
printf("Output opening: OK.\n");
for(i = 0; i < n; i++)
{
fprintf(output,"VarA: %f\n",VarA[i]);
fprintf(output,"VarB: %f\n",VarB[i]);
}
fclose(output);
free(VarA);
free(VarB);
return 0;
}
But if I add any simple arithmetic operation involving these arrays, the program simply crashes right after the second input is opened. For instance, suppose that I add the following lines to the code:
float SumA;
SumA = VarA[0] + VarB[0];
printf("SumA is: %f\n", SumA);
So that we get:
#include <stdio.h>
#include <stdlib.h>
int main()
{
float *VarA;
float *VarB;
float SumA;
int n = 0;
int m = 0;
int i;
FILE *input1;
FILE *input2;
FILE *output;
input1 = fopen("C:\\...\\test.txt","r");
if (input1 == NULL)
{
printf("Error! Could not open input 1.\n");
exit(1);
}
else
printf("Input1 opening: OK.\n");
input2 = fopen("C:\\...\\test2.txt","r");
if (input2 == NULL)
{
printf("Error! Could not open input 2.\n");
exit(1);
}
else
printf("Input2 opening: OK.\n");
while(fscanf(input1,"%f") == 1)
n++;
rewind(input1);
printf("n = %i\n", n);
while(fscanf(input2,"%f") == 1)
m++;
rewind(input2);
printf("m = %i\n", m);
if(m != n)
{
printf("Error: Number of rows does not match!\n");
exit(1);
}
else
printf("Number of rows matches.\n");
VarA = calloc(n, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarA.\n");
exit(1);
}
VarB = calloc(m, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarB.\n");
exit(1);
}
for(i = 0; i < n; i++)
fscanf(input1,"%f",&VarA[i]);
fclose(input1);
for(i = 0; i < m; i++)
fscanf(input2,"%f",&VarB[i]);
fclose(input2);
for(i = 0; i < n; i++)
{
printf("VarA: %f\n",VarA[i]);
printf("VarB: %f\n",VarB[i]);
}
output = fopen("C:\\...\\out.txt","w");
if (output == NULL)
{
printf("Error! Could not open output.\n");
exit(1);
}
else
printf("Output opening: OK.\n");
for(i = 0; i < n; i++)
{
fprintf(output,"VarA: %f\n",VarA[i]);
fprintf(output,"VarB: %f\n",VarB[i]);
}
fclose(output);
SumA = VarA[0] + VarB[0];
printf("SumA is: %f\n", SumA);
free(VarA);
free(VarB);
return 0;
}
Then the program stops working. I tried to change the positions of these lines, but the result is the same. Does anyone know what I'm doing wrong?

Related

Reading an array from a file then writing it to another

I believe I have a problem with my structure pointer (head), but I'm not sure where I'm doing wrong. It reads the data from the file fine for the headercheck function so I have no clue if that's it or not. I would rather have the structure pointer global, because this is part of a very big program with switch case statements and all that, but it doesn't like that.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxheight 1080
#define maxwidth 1920
#define RGB_COMPONENT_COLOUR 255
#define pgmtype "P2"
#define ppmtype "P3"
typedef struct {
int x, y;
}
PPMImage;
typedef struct {
int rgb_comp_colour;
char filetype[2];
int height;
int width;
}
PPMHead;
/*PPMHead head[3];
{
head[3].filetype;
head[3].height;
head[3].width;
}
PPMHead *ptr_head = NULL;
ptr_head = head;*/
PPMPixel * data; //Defines pointer to PPMPixel
int ** Array; //Double pointer defines as a pointer pointing to a pointer that is pointing to an integer
PPMPixel ** RGBArray; //Double pointer defines as a pointer pointing to a pointer that is pointing to the PPMPixel structure
FILE * fp;
int r, g, b;
void headercheck() {
PPMHead * ptr_head, head;
ptr_head = & head;
fscanf(fp, "%s %d %d %d", head.filetype, & head.width, & head.height, & head.rgb_comp_colour);
printf("%s %d %d %d", head.filetype, head.width, head.height, head.rgb_comp_colour);
if (head.width > maxwidth || head.height > maxheight) {
printf("\tInvalid image size. The maximum value of image is 1920x1080.\n");
printf("\tImage size is %d x %d\n", head.width, head.height);
} else {
printf("\tImage size is valid\n");
printf("\tImage size is %d x %d\n", head.width, head.height);
}
if ((strcmp(head.filetype, pgmtype) != 0) && (strcmp(head.filetype, ppmtype) != 0)) {
printf("\tInvalid filetype\n");
} else {
if (strcmp(head.filetype, pgmtype) == 0) {
printf("\t File is PGM type image\n");
} else {
if (strcmp(head.filetype, ppmtype) == 0) {
printf("\t File is PPM type image\n");
}
}
}
if ((head.rgb_comp_colour == RGB_COMPONENT_COLOUR)) {
printf("\t Image is 8 bit\n");
} else {
if (head.rgb_comp_colour > RGB_COMPONENT_COLOUR) {
printf("Maximum bit-depth is 8 bits\n");
} else {
printf("\tImage is not 8 bit\n");
}
}
}
int main(void) {
PPMHead * ptr_head, head;
ptr_head = & head;
char fname[100];
printf("Enter file name: ");
scanf("%s", fname);
fseek(stdin, 0, SEEK_END);
fp = fopen(fname, "r");
if (fp == NULL) {
printf("\tError while opening the file\n");
} else {
printf("\tReading in %s\n", fname);
}
//Checking for comments
//Skip whitespace and comments
headercheck();
if (strcmp(head.filetype, pgmtype) == 0) {
printf("\tReading in PGM image...\n");
* Array = malloc(head.width * sizeof(int * )); //Points to malloc
for (int i = 0; i < head.width; i++) {
Array[i] = (int * ) malloc(head.height * sizeof(int));
if ((Array = NULL)) {
printf("Error allocating memory to the array");
} else {
printf("Memory allocated to the PGM array sucessfully");
}
}
for (int j = 0; j < head.height; j++) {
for (int i = 0; i < head.width; i++) {
fscanf(fp, "%3d ", & Array[i][j]); //Scans the address of Array[i][j]
}
}
}
fclose(fp);
//Save PPM Array Into New PPM File
FILE * pf;
int i, j;
char fname2[100];
printf("Enter file name: ");
scanf("%s", fname2);
fseek(stdin, 0, SEEK_END);
pf = fopen(fname2, "w");
if (pf == NULL) {
printf("\tError while opening the file\n");
} else {
printf("\tWriting in %s\n", fname2);
}
if (strcmp(head.filetype, pgmtype) == 0) {
for (j = 0; j < head.height; j++) {
fprintf(pf, "\n");
for (i = 0; i < head.width; i++) {
fprintf(pf, "%3d ", Array[i][j]);
//fprintf(pf, "%3d ", **(Array+j*head[0].width + i));
}
}
}
fclose(pf);
for (int i = 0; i < head.width; i++) {
free(Array[i]);
Array[i] = NULL;
}
free(Array);
Array = NULL;
return 0;
}

Reading a matrix from file in C

I want to read the matrix from file and store it in an array. But the array is storing only the last value of matrix. Can anyone explain this please?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp, *fp1;
int n = 0, i, j, a[4][4], b[16];
fp = fopen("Output.txt", "r");
if (fp == NULL) {
printf("\nError; Cannot open file");
exit(1);
}
while (!feof(fp)) {
i = 0;
fscanf(fp, "%d", &n);//reads the file containing matrix
b[i] = n;//this part is not working
printf("%d\n", n);
i++;
}
fclose(fp);
fp1 = fopen("Output2.txt", "w");
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
fprintf(fp1, "%d\t", a[i][j] * 2);
}
fprintf(fp1, "\n");//creates file of altered matrix
}
fclose(fp1);
return 0;
}
Your input loop is incorrect:
you reset i to 0 at the beginning of each iteration
you use an incorrect test: while (!feof(fp)). Learn here why: Why is “while ( !feof (file) )” always wrong? . You should instead test the array index against the array length and check if fscanf() succeeds at reading the next value.
Here is a corrected version:
for (i = 0; i < 16; i++) {
if (fscanf(fp,"%d",&n) != 1) { //reads the file containing matrix
fprintf(stderr, "invalid input\n");
exit(1);
}
b[i] = n;
printf("%d\n", n);
}
Note also that you do not read the values into the 2D matrix, so the output loop has undefined behavior because a is uninitialized.
Here is a improved version:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
int i, j, a[4][4];
fp = fopen("Output.txt", "r");
if (fp == NULL) {
fprintf(stderr, "Error: Cannot open file Output.txt for reading\n");
exit(1);
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (fscanf(fp, "%d", &a[i][j]) != 1) {
fprintf(stderr, "invalid input for a[%d][%d]\n", i, j);
fclose(fp);
exit(1);
}
}
}
fclose(fp);
fp1 = fopen("Output2.txt", "w");
if (fp1 == NULL) {
fprintf(stderr, "Error: Cannot open file Output2.txt for writing\n");
exit(1);
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
fprintf(fp1, "%d\t", a[i][j] * 2);
}
fprintf(fp1, "\n");
}
fclose(fp1);
return 0;
}

Printed Array table comes out multiple times

When I execute my code I keep getting the right answers but it is printed multiple times? I want it display a table with with 5 columns and 3 rows and there should be 4 of these tables but I get three times too many and I don't know why?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
int w;
int n = 1;
int i;
for(w = 1; w < 5; w++){
FILE *myFile;
float numberArray[1];
if(n == 4){
myFile = fopen("input4.txt", "r");
n++;
}
if(n == 3){
myFile = fopen("input3.txt", "r");
n++;
}
if(n == 2){
myFile = fopen("input2.txt", "r");
n++;
}
if(n == 1){
myFile = fopen("input1.txt", "r");
n++;
}
if (myFile == NULL)
{
printf("Error Reading File\n");
exit (0);
}
printf("Enter 3 numbers between 0 and 9.999:\n");
printf("Number sin cos tan atan\n");
printf("-------------------------------------------\n");
for (i = 0; i < 3; i++)
{
fscanf(myFile, "%f,", &numberArray[i] );
}
for (i = 0; i < 3; i++)
{
printf("%.6f %.4f %.4f %.4f %.4f\n",numberArray[i], sin(numberArray[i]), cos(numberArray[i]), tan(numberArray[i]), atan(numberArray[i]));
}
fclose(myFile);
}
return 0;
}
You are reading and writing in unallocated memory space when accessing numberArray.
You defined numberArray[1] with a size of 1, yet you are accessing numberArray[1..2] in your loops here :
for (i = 0; i < 3; i++)
{
fscanf(myFile, "%f,", &numberArray[i] );
}
for (i = 0; i < 3; i++)
{
printf("%.6f %.4f %.4f %.4f %.4f\n",numberArray[i], sin(numberArray[i]), cos(numberArray[i]), tan(numberArray[i]), atan(numberArray[i]));
}
I have not tested your code, but this seems to be the most obvious culprit.

Reading a dynamic array from a file with function

I have the following code:`
#include <stdio.h>
#include <stdlib.h>
void load_from_file(int A[], int *n);
int main()
{
int *A;
A = (int*)malloc(0);
int count = 0;
int i;
load_from_file(A, &count);
for(i = 0; i < count; i++)
{
printf("A[%d]=%d ", i, A[i]);
printf("\n");
printf("&A[%d]=%p \n\n", i, &A[i]);
}
return 0;
}
void load_from_file(int A[], int *n)
{
FILE* fp;
int temp, i;
fp = fopen("data.txt", "r");
if (fp == NULL)
{
printf("error!!");
exit (1);
}
fscanf(fp, "%d", &temp);
*n = temp;
A = (int*) realloc(A, temp * sizeof(int));
if (*A == NULL)
{
printf("error realloc!!");
exit(1);
}
for(i = 0; i < temp; i++)
{
fscanf(fp, "%d", &A[i]);
}
for(i = 0; i < temp; i++)
{
printf("A[%d]=%d ", i, A[i]);
printf("\n");
printf("&A[%d]=%p \n\n", i, &A[i]);
}
fclose(fp);
}
I'm trying to read a text file into an array.
First line of the file has the number of elements of the array, and second line the numbers-elements.
We create the array through realloc.
But something is going wrong.....
I have some patches, printing the address of array's elements.
But unfortunatelly they are different(not all the times) inside the function, and outside the function, although an array is passed by reference (as I think...)
Please, tell me where is the mistake, and how can I fix the problem.
Thanks in advance...
Dimitri
Call:
int *A = load_from_file(&count);
Function:
int *load_from_file(int *n)
{
FILE* fp;
int temp,i;
int *A = 0;
fp=fopen("data.txt","r");
if (fp==NULL){fprintf(stderr, "error!!\n");exit (1);}
fscanf(fp,"%d",&temp);
*n=temp;
A = (int*) realloc(A,temp * sizeof(int));
if (A == NULL) {fprintf(stderr, "error realloc!!\n");exit(1);}
for(i=0;i<temp;i++)
fscanf(fp, "%d",&A[i]);
for(i=0;i<temp;i++)
{
printf("A[%d]=%d ",i,A[i]);
printf("\n");
printf("&A[%d]=%p \n\n",i,&A[i]);
}
fclose(fp);
return A;
}
This is a totally minimal set of changes; the code needs a lot more work. In particular, the fscanf() calls should be error checked. There's a subtle but important change in the allocation test: if (A == NULL) rather than the original if (*A == NULL).
With somewhat more complete error checking:
int *load_from_file(int *n)
{
FILE *fp;
int temp, i;
int *A = 0;
const char file[] = "data.txt";
fp = fopen(file, "r");
if (fp == NULL)
{
fprintf(stderr, "Failed to open file %s for reading\n", file);
exit(1);
}
if (fscanf(fp, "%d", &temp) != 1)
{
fprintf(stderr, "Failed to read number of entries\n");
exit(1);
}
*n = temp;
A = (int *) realloc(A, temp * sizeof(int));
if (A == NULL)
{
fprintf(stderr, "Failed to reallocate %zu bytes of memory\n",
temp * sizeof(int));
exit(1);
}
for (i = 0; i < temp; i++)
{
if (fscanf(fp, "%d", &A[i]) != 1)
{
fprintf(stderr, "Failed to read entry number %d\n", i);
exit(1);
}
}
for (i = 0; i < temp; i++)
printf("A[%d]=%d: &A[%d]=%p\n", i, A[i], i, &A[i]);
fclose(fp);
return A;
}
I have a library of error reporting functions that I use which would reduce the error handling from 4 lines to 1 line per error. I strongly recommend creating and using such a library for yourself.

fscanf() doesn't want to read values after the first two are read

Basically, I'm reading a bunch of values from a text file, which has them in the following layout:
4 1 1 2 3 4
But the following block of code doesn't want to read the double type value following the first two int type values:
int matrix_read(struct matrep *mat, const char *filename)
{
FILE *fptr;
unsigned m, n;
double *ptr = NULL;
int i, j;
double x;
if ((fptr = fopen(filename, "r")) == NULL)
{
fprintf(stderr, "Cannot Open File %s\n", filename);
return -1;
}
if(fscanf(fptr, "%u", &m) != 1)
{
fprintf(stderr, "Failed to read number of rows\n");
return -1;
}
if(fscanf(fptr, "%u", &n) != 1)
{
fprintf(stderr, "Failed to read number of columns\n");
return -1;
}
mat->matrix = (double *)malloc(sizeof(double) * m * n);
if (mat->matrix == 0)
{
fprintf(stderr, "Failed to allocate %d*%d matrix\n", m, n);
return -1;
}
ptr = mat->matrix;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
double x;
if (fscanf(fptr, "%f", &x) != 1)
{
fprintf(stderr, "Failed to read element matrix[%d,%d]\n", i, j);
free(mat->matrix);
mat->matrix = 0;
mat->cols = 0;
mat->rows = 0;
return -1;
}
*ptr++ = x;//Here it reads nothing, it just gives me: -9.2559604281615349e+061
}
}
fclose(fptr);
mat->cols = m;
mat->rows = n;
return 0; // Success
}
What am I doing wrong?
fscanf(fptr, "%f", &x)
For scanning doubles, you need the %lf format. %f scans a float. Using the wrong format invokes undefined behaviour, what probably happens is that the scanned value is converted to a float and then stored in the first four bytes of the pointed-to double.

Resources