Consider some refactoring of the code.
Code:
#define B_MAX_ROWS 10
#define B_MAX_COLS 10
#define F_MAX_ROWS 10
#define F_MAX_COLS 10
double blade_d[B_MAX_ROWS][B_MAX_COLS];
double airfoil_d[2][F_MAX_ROWS][F_MAX_COLS];
void read_blade(const char *filename) {
fp=fopen(filename,"r");
if(fp) {
char row[1000];
for(int r = 0 ;
r < B_MAX_ROWS && fgets(row,sizeof(row),fp) != NULL ;
r++ ) {
char *tok;
for(int c = 0, tok1 = strtok(row,",") ;
c < B_MAX_COLS && tok != NULL ;
c++, tok = strtok(NULL,",") ) {
blade_d[r][c] = strtod(tok,NULL);
}
}
fclose(fp);
}
}
void read_airfoil(const char *filename, int set) {
fp=fopen(filename,"r");
if(fp) {
char row[1000];
for(int r = 0 ;
r < F_MAX_ROWS && fgets(row,sizeof(row),fp) != NULL ;
r++ ) {
char *tok;
for(int c = 0, tok1 = strtok(row," ") ;
c < F_MAX_COLS && tok != NULL;
c++, tok = strtok(NULL," ") ) {
airfoil_d[set][r][c] = strtod(tok,NULL);
}
}
fclose(fp);
}
}
DEFINE_EXECUTE_ON_LOADING(data_import,libname) /*macro definition*/
{
/*First file*/
read_blade("RCT.csv");
Message("\n %f\n", blade_d[0][0]) ; /*A command to display messages*/
/*Second and third file*/
read_airfoil("Data_C_l.txt",0);
read_airfoil("Data_C_d.txt",1);
Message("\n %f\n", blade_d[0][0]) ;
}
Points to note
1. fgets returns a result, which does away with the messyness of checking feof
2. You can have more than one variable in a for loop. This makes it easy to strtok your way through a string and keep track of how many values have been read.
3. When reading from a file, error check and range check everything.