I couldn't find solution to exercise5 day2 for reading large binary file in official NHERI github folder:
SimCenterBootcamp2020/code/c/ExerciseDay2/Solutions/
Will the correct solution of file3.c be provided so that I can verify my answer.
Also the file3.c gives no error when I compile on gcc 10.2.0, msys2. But it gives error on icc.
Here is my solution that works on icc without error, is it correct:
// program to read values from a file, each file a csv list of int and two double
// written: fmk
// exercise solved by: fr
#include <stdio.h>
#include <stdlib.h>
int getcountlines(char *filename);
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stdout, "ERROR correct usage appName inputFile\n");
return -1;
}
//count total number of lines from very beginning just in case
//if lines exceeds maxVectorSize (100)
int countlines = 0; //used to count lines
// count lines
countlines = getcountlines(argv[1]);
if (countlines == -1){
printf("the text file is empty\n aborting program ...\n");
return -1;
}
printf("total number of lines are: %i\n\n",countlines);
FILE *filePtr = fopen(argv[1],"r");
int i = 0;
float float1, float2;
int maxVectorSize = 100;
double *vector1 = (double *)malloc(maxVectorSize*sizeof(double));
double *vector2 = (double *)malloc(maxVectorSize*sizeof(double));
int vectorSize = 0;
while (fscanf(filePtr,"%d, %f, %f\n", &i, &float1, &float2) != EOF) {
vector1[vectorSize] = float1;
vector2[vectorSize] = float2;
printf("%d, %f, %f\n",i, vector2[i], vector1[i]);
vectorSize++;
if (vectorSize == maxVectorSize) {
maxVectorSize = countlines;
vector1 = (double *) realloc(vector1,maxVectorSize*sizeof(double)); // allocate again
vector2 = (double *) realloc(vector2,maxVectorSize*sizeof(double)); // allocate again
}
}
free(vector1);
free(vector2);
fclose(filePtr);
}
//function to countlines
int getcountlines(char *filename)
{
// count the number of lines in the file called filename
FILE *fp = fopen(filename,"r");
int ch=0;
int lines=0;
if (fp == NULL){
return -1;
}
while (EOF != (fscanf(fp, "%*[^\n]"), fscanf(fp,"%*c")))
++lines;
fclose(fp);
return lines;
}