Tuesday, November 15, 2011

Parsing a text file, sorting lexigraphically and writing the output.

Here is code to parse a text file, sort it, and output it to another file.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

#define MAX_LINE_LEN 1024

typedef struct{
int arraySize;
int arrayElements;
char ** arrayPtr;
} da_string;

void da_string_Init(da_string * dal, int initialSize){
dal->arrayElements = 0;
dal->arraySize = initialSize;
dal->arrayPtr = (char **)malloc(sizeof(char *)*initialSize);
}

void da_string_Destroy(da_string * dal){
    int i;
    for(i = 0; i < dal->arrayElements; i++)
        free( dal->arrayPtr[i]);

    free(dal->arrayPtr);
    dal->arrayPtr = NULL;
dal->arrayElements = 0;
dal->arraySize = 0;
}

void da_string_AddItem(da_string * dal, char * item){
if(dal->arrayElements >= dal->arraySize){
dal->arraySize *= 2;    
dal->arrayPtr = (char ** ) realloc (dal->arrayPtr,  dal->arraySize * 
sizeof(char *));
}
dal->arrayPtr[dal->arrayElements++] = item;
}

char * da_string_GetItem(da_string * dal, int index){
return dal->arrayPtr[index];
}

int compareAscInt (const void * a, const void * b){
    return ( *(int*)a - *(int*)b );
}

int compareDcsString (const void * a, const void * b){
    return (strcmp(*(char **)b,*(char **)a));
}

FILE *inputFile = NULL;
FILE *outputFile = NULL;

da_string stringArray;

char lineBuffer[MAX_LINE_LEN];

int main(int argc, char *argv[]){
    
    if(argc != 3){
        fprintf(stderr, "error argg\n");
        return -1;
    }
    inputFile = fopen(argv[1], "r+"); //stdin is a valid file stream
    outputFile = fopen(argv[2],"w+");
da_string_Init(&stringArray,10);
    
    while ( fgets (lineBuffer, sizeof(lineBuffer), inputFile) != NULL){
        
        char temp[MAX_LINE_LEN];
        
        int i,j;
        for(i = 0,j = -1; i < MAX_LINE_LEN; i++){
            if(lineBuffer[i] == ','){
                j = i; 
                printf("%d\n",j);
            }
        }
        
        if(sscanf(lineBuffer,"%s",temp) == 1){
            
            int dataLen = strlen(temp) + 1;
            if(dataLen <= 1)
                continue;
            
            char  * data = calloc(dataLen,sizeof(char));
            data[dataLen - 1 ] = 0;
            
            strncpy(data,temp,dataLen);
            
            da_string_AddItem(&stringArray,data);
        }

    }
    qsort (stringArray.arrayPtr, stringArray.arrayElements, sizeof(char *), compareDcsString);
    
    int i;
    for(i = stringArray.arrayElements-1; i >= 0; i--){
        fprintf(outputFile,"%s\n",da_string_GetItem(&stringArray,i));
    }
    
    fclose (inputFile);
    fclose (outputFile);
    
da_string_Destroy(&stringArray);

    return 0;
}