PDA

Visualizza la versione completa : [C] ordinare delle righe


matrics
01-03-2007, 18:20
Ho n file di testo il cui nome Ŕ passato come parametro, devo creare un file di testo contenente tutte le righe dei file ordinate lessicograficamente.
Supponendo di dover usare la funzione qsort, i problemi sostanzialmente sono:

1)Mi creo un buffer gigantesco dove copiare tutte le righe e poi ordinare o cosa?
2)La funzione qsort vuole fra i vari parametri la dimensione di un singolo elemento dell'array. Ma qui ogni elemento (la riga di testo) ha una sua dimensione.

MItaly
01-03-2007, 18:38
Ti crei un array di tanti puntatori a stringa quante sono le righe, ciascuno dei quali puntatori punta alla stringa contenente la riga corrispondente che avrai caricato in precedenza. Quindi passi a qsort l'array di puntatori dicendogli di usare come funzione di confronto una funzione che avrai definito in questo modo:


int cmplines(void *arg1, void *arg2)
{

return strcmp(*(char **)arg1,*(char **)arg2);
}
.

matrics
01-03-2007, 18:43
Originariamente inviato da MItaly
Ti crei un array di tanti puntatori a stringa quante sono le righe, ciascuno dei quali puntatori punta alla stringa contenente la riga corrispondente che avrai caricato in precedenza. Quindi passi a qsort l'array di puntatori dicendogli di usare come funzione di confronto una funzione che avrai definito in questo modo:


int cmplines(void *arg1, void *arg2)
{

return strcmp(*(char **)arg1,*(char **)arg2);
}
.


1)Come so quanto sarÓ grande l'array a priori?
2)Credo di non aver intuito come funziona l'algoritmo che mi hai detto per ordinare le righe :fagiano:

MItaly
01-03-2007, 18:59
Originariamente inviato da matrics
1)Come so quanto sarÓ grande l'array a priori?

Credo che ti convenga contare le righe e poi allocare dinamicamente l'array di puntatori.


2)Credo di non aver intuito come funziona l'algoritmo che mi hai detto per ordinare le righe :fagiano:
Io non ti ho detto alcun algoritmo, ti ho solo suggerito come usare la funzione qsort in questo caso... dai un'occhiata alla documentazione, poi eventualmente chiedi. :)

matrics
01-03-2007, 19:01
Originariamente inviato da MItaly
Credo che ti convenga contare le righe e poi allocare dinamicamente l'array di puntatori.

Io non ti ho detto alcun algoritmo, ti ho solo suggerito come usare la funzione qsort in questo caso... dai un'occhiata alla documentazione, poi eventualmente chiedi. :)


ma il funzionamento della qsort lo conosco, i dubbi li ho sul buffer e sulla dimensione del dato

MItaly
01-03-2007, 19:29
Allora, mi spiego meglio; leggi il file e verifichi quante righe ci sono; memorizzi tale numero in una variabile (diciamo numRighe), quindi:


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);
}

Loading