Another way. This is with Turbo C, so the file names had to be shortened.
..Input file: FinalIn.txt
Output file: FinalOut.txt
Code:
#include <stdio.h>
#include <string.h>
#define MAX 15
void sort(char num[][5], int r, int lo, int hi, int type, int idx[MAX]);
int main() {
int i,r,c,type;
int idx[MAX];
char num[MAX][5];
char line[MAX];
FILE *fp;
printf("\n\n\n");
fp=fopen("FinalIn.txt", "r");
if(fp==NULL) {
printf("Error opening file - Correct file name is FinalIn.txt \n");
return 1;
}
r=0;c=0;
while((fgets(line, sizeof(line), fp)) != NULL) {
sscanf(line, "%c %c %c %c ", &num[r][c],&num[r][c+1],&num[r][c+2],&num[r][c+3]);
num[r][4]='\0';
sort(num, r, 0, 4, 0, idx); //sort each row
++r;
}
fclose(fp);
fp=fopen("FinalOut.txt", "wt");
putchar('\n');
sort(num, 0, 0, MAX, 1, idx); //sort through the index
for(i=0;i<MAX;i++)
fprintf(fp,"%s\n", num[idx[i]]);
fclose(fp);
printf("\n\n\t\t\t press enter when ready\n");
printf("\n\t\t\t Output file is FinalOut.txt\n");
(void) getchar();
return 0;
}
void sort(char num[][5], int r, int lo, int hi, int type, int idx[MAX]) {
int i, j;
char val;
char *pval;
if(!type) { //regular insertion sort
for(i=lo+1;i<hi;i++) {
val = num[r][i];
j = i-1;
while(num[r][j] > val) {
num[r][j + 1] = num[r][j];
--j;
if(j<0) break;
}
num[r][j+1] = val;
}
}
else { //insertion sort of strings, through an index array
for(i=0;i<MAX;i++)
idx[i]=i;
for(i=lo+1;i<hi;i++) {
pval = num[idx[i]];
j = i-1;
while(strcmp(num[idx[j]], pval) >0) {
idx[j+1] = idx[j];
--j;
if(j<0) break;
}
idx[j+1] = i;
}
}
}