Allora, mi spiego meglio; leggi il file e verifichi quante righe ci sono; memorizzi tale numero in una variabile (diciamo numRighe), quindi:
codice:
rewind(fs); //supponendo che lo stream si chiami fs
char ** righe=calloc(numRighe, sizeof(char *));
char bufriga[8192]; //ampliabile a piacimento
for(int riga=0;riga<numRighe;riga++)
{
fgets(bufriga, sizeof(bufriga)/sizeof(char), fs);
if(ferror) break;
bufriga[sizeof(bufriga)/sizeof(char)-2]='\n'; //si assicura che il newline ci sia sempre
righe[counter]=calloc(strlen(bufriga)+1, sizeof(char));
strcpy(righe[counter], bufriga);
}
qsort(bufriga, numRighe, sizeof(char *), cmplines);
//...chiusura del file di input, apertura del file di output...
//supponiamo che quest'ultimo si chiami os
//...
for(int riga=0;riga<numRighe; riga++)
{
fputs(righe[riga],os); //stampa il valore
free(righe[riga]); //dealloca la memoria
}
free(righe);
//...chiusura del file di output, varie ed eventuali...
//...
int cmplines(void *arg1, void *arg2)
{
return strcmp(*(char **)arg1,*(char **)arg2);
}