#include <stdlib.h>
#include<stdio.h>
#include <iostream>
using namespace std;
//=================================================================================
//path: the path of CSV file
//arr2: the data of CSV saved in arr2
//the memory of arr2 is not malloc()ed in my_ReadSingleCSV(),
//thus,the function that call my_ReadSingleCSV() must malloc() memory for arr2
//ROWS: total rows of CSV sheets
//COLS: total columns of CSV sheets
void my_ReadSingleCSV(char *path, double **arr2, int ROWS, int COLS)
{
FILE *fp = NULL;
fp = fopen(path, "at+");
if ( NULL == fp )
{
cout << "Failed to open " << path << endl;
}
char d;
int ret=1;
int i = 0;
while ( ret != EOF && i < ROWS )
{
for(int j=0; j<COLS; j++)
{
ret = fscanf( fp, "%lf", &arr2[i][j]);
ret = fscanf( fp, ",", &d);
}
i++;
}
fclose(fp);
}
//=================================================================================
//paths: the path of all CSV sheets in paths
//arr3D: the data of all CSV sheets saved in arr3D
//the memory of arr3D is not malloc()ed in my_ReadMultiCSV(),
//thus,the function that call my_ReadSingleCSV() must malloc() memory for arr3D
//NUMS: the number of CSV sheets to be read
//ROWS: total rows of every CSV sheets
//COLS: total columns of every CSV sheets
void my_ReadMultiCSV(char ** paths, double ***arr3D, int NUMS, int ROWS, int COLS)
{
for(int n=0; n<NUMS; n++)
{
char path[260];
strcpy(path, paths[n]);
my_ReadSingleCSV(path, arr3D[n], ROWS, COLS);
}
}
//=================================================================================
//we have malloc() contiguous memory chunks for arr3D in my_ReadingMultiCSV()
//thus, in function that call my_ReadingMultiCSV(), we just do
//double ***DatasAllCSV = my_ReadingMultiCSV(NUMS, ROWS, COLS);
double *** my_ReadingMultiCSV(int NUMS, int ROWS, int COLS)
{
//*------------------------ set paths ------------------------------*//
char *paths1D;
paths1D = (char *)malloc( NUMS*260*sizeof(char) );
char **paths2D;
paths2D = (char **)malloc(NUMS*sizeof(char *));
for(int n=0; n<NUMS; n++)
{
paths2D[n] = paths1D + n*260;
}
strcpy(paths2D[0], "/home/zlf/Documents/code/MTF/MTF_rdc.csv");
strcpy(paths2D[1], "/home/zlf/Documents/code/MTF/MTF_gdc.csv");
strcpy(paths2D[2], "/home/zlf/Documents/code/MTF/MTF_bdc.csv");
strcpy(paths2D[3], "/home/zlf/Documents/code/MTF/MTF_rac.csv");
//*------------------------ set arr3D ------------------------------*//
double * arr1D=NULL;
arr1D = (double *)malloc( NUMS*ROWS*COLS*sizeof(double) );
double ** arr2D=NULL;
arr2D = (double **)malloc(NUMS*ROWS*sizeof(double *));
for(int dh=0; dh<NUMS*ROWS; dh++)
{
arr2D[dh] = arr1D + dh*COLS;
}
double *** arr3D=NULL;
arr3D = (double ***)malloc(NUMS*sizeof(double **));
for(int d=0; d<NUMS; d++)
{
arr3D[d] = arr2D +d*ROWS;
}
my_ReadMultiCSV(paths2D, arr3D, 4, 2, 2);
return arr3D;
}
//=================================================================================
int main()
{
int NUMS=4;
int ROWS=2;
int COLS=2;
double ***DatasAllCSV = my_ReadingMultiCSV(NUMS, ROWS, COLS);
for(int n=0; n<NUMS; n++)
{
printf("DatasAllCSV[%d]=: \n", n);
for(int r=0; r<ROWS; r++)
{
for(int c=0; c<COLS; c++)
{
printf("%f ",DatasAllCSV[n][r][c]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
运行结果:
DatasAllCSV[0]=:
1.000000 2.000000
2.000000 4.000000
DatasAllCSV[1]=:
2.000000 4.000000
4.000000 8.000000
DatasAllCSV[2]=:
3.000000 6.000000
6.000000 12.000000
DatasAllCSV[3]=:
4.000000 8.000000
8.000000 16.000000