Thread: Need Help: Storing numeric data into matrix from a data file

  1. #1
    Registered User
    Join Date
    Feb 2008
    Posts
    16

    Unhappy Need Help: Storing numeric data into matrix from a data file

    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.

  2. #2
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    Your second call to fopen doesn't use the same file as the first. (You shouldn't close-and-open anyway; use rewind() instead.)

    You don't check that fopen actually opens a file.

    gets() is bad; look into fgets instead. (Not an immediate issue, but soon.)

  3. #3
    Hurry Slowly vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,788
    do not use gets - see FAQ
    use fgets - see FAQ how: http://faq.cprogramming.com/cgi-bin/...&id=1043284385

    fgetc returns int - declare ch as int
    increase your warning level to avoid such errors

    check the return value of all functions tha can fail like fopen, malloc, fscanf

    do not cast malloc - see FAQ
    All problems in computer science can be solved by another level of indirection,
    except for the problem of too many layers of indirection.
    – David J. Wheeler

  4. #4
    Registered User
    Join Date
    Feb 2008
    Posts
    16
    Oh... i am sorry. Actually I used fgets but somehow during i changed it to gets. But my problem remains in both cases.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Data Structure Eror
    By prominababy in forum C Programming
    Replies: 3
    Last Post: 01-06-2009, 09:35 AM
  2. Replies: 48
    Last Post: 09-26-2008, 03:45 AM
  3. Skipping records to text file and storing data.
    By Mr. Deeds in forum C Programming
    Replies: 5
    Last Post: 09-10-2007, 11:24 PM
  4. Possible circular definition with singleton objects
    By techrolla in forum C++ Programming
    Replies: 3
    Last Post: 12-26-2004, 10:46 AM
  5. HUGE fps jump
    By DavidP in forum Game Programming
    Replies: 23
    Last Post: 07-01-2004, 10:36 AM