Hi all,

I need your help regarding huge file handling. Suppose i want to read a file and store numeric data into 2D matrix. The file i am using is attached (a .dat file converted into .txt for this post) and it contains 690 rows and 15 columns.

I have written a sample program that asks user to provide the name of the file in the "main" function and calls another function "getdata" which counts number of rows and columns (though it is provided but i need this for my future work), stores numeric data into a 2D matrix and returns a structure pointer (contains rowCount, columnCount and a 2D array pointer).

My code works for small data but somehow fails for the datafile attached with this thread.

Code:
#include <stdio.h>
#include <stdlib.h>

struct matrix
{
	int nRow;
	int nCol;
	float **m;
};

typedef struct matrix *data;

data getdata(char file_path_name[])
{
	FILE *db;
	char ch;
	int i, j, cols;
	int rows = 0, entries = 0;

	data ptrdata=(data)malloc(sizeof(data*)) ;
	db = fopen(file_path_name, "r");

	printf("\nCollecting information...\n");

	while(1)
		{
			ch=fgetc(db);
			if(ch==EOF)
				{
					//rows++;
					//entries++;
					break;
					}
			if(ch=='\n')
				{
					rows++;
					entries++;
					}
			if(ch==' ')
			entries++;
			}

	fclose(db);

	cols = entries/rows;

	printf("\nData contains %d rows and %d columns\n", rows, cols);

	ptrdata->nRow = rows;
	ptrdata->nCol = cols;

	db = fopen("data.dat", "r");
	ptrdata->m = (float **) malloc(rows * sizeof(float *));

	for(i = 0; i < rows; i++)
		ptrdata->m[i] = (float *) malloc(cols * sizeof(float));

	for(i = 0; i < rows; i++)
		for(j = 0; j < cols; j++)
			fscanf(db, "%f", &(ptrdata->m[i][j]));

	fclose(db);
	return ptrdata;
}

int main()
{
	 char file_path_name[100];
	 data pb;
	 int i, j;

	 printf("Provide name of the file (including path):\n");
	 gets(file_path_name); //data.dat

	 pb = getdata(file_path_name);

	 printf("\nPrinting data matrix...\n\n");

	 for(i = 0; i < pb->nRow; i++)
	 //for(i = 0; i < 5; i++)
	 {
		for(j = 0; j < pb->nCol; j++)
		//for(j = 0; j < 5; j++)
		{
			printf("%.2f ",*(*((pb->m)+i)+j));
			}
		putchar('\n');
		}
	 return 0;
	 }
Please help.
Thanks.