Newsgroup: it.comp.os.linux.development
Titolo: Ordinamento nomi in un file

Ciao a tutti,
dovrei leggere un file di questo tipo:
dsfhjs fjdk fsd fdsfs dsf fsdf sdfd hfgh rtyr gdg fssf fssf
e suddividerlo in tante piccole stringhe quanti sono i nomi per fare un
ordinamento.
L'ordinamento è un Bubble Sort  ( non mi interessa la complessità ).
Il mio scopo è infatti quello di memorizzare ogni nome dentro un array
diverso e procedere con l'ordinamento.
Il problema è che non conosco nessuna funzione che faccia questa cosa,
e non mi viene in mente nessun modo per risolvere questo problema.
E' una cosa un pò macchinosa ma è l'unico modo che mi viene in mente
per ordinare questo file. 
Grazie mille per la gentile risposta.

 ordinamento.
linguaggio?  se C, prova strtok...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

> Grazie mille per la gentile risposta.
ma.. in bash?

Ho provato la strtock, mi chiedevo:
esiste una funzione in C che ha questo pseudoprototipo --->
nome_funzione ( stringa, parametro_di_divisione, numero_sottostringhe )
?!?!
Se ci fosse sarei a cavallo...
Grazie mille



 nome_funzione ( stringa, parametro_di_divisione, numero_sottostringhe )
no
un paio di puntatori , un bel ciclo, e via!
oppure strtok o strtok_r

 ordinamento.
strings TuoFile | sort | uniq
GP

ho risolto in questo modo:
int firstchar(const void *vp0, const void *vp1)
{
int r;
const char **cpp0 = (const char **)vp0;
printf ("%s\n" , vp0 );
const char **cpp1 = (const char **)vp1;
printf ("%s\n",vp1);
perror (":P");
r = **cpp0 - **cpp1;    // ecco il signor segmentation fault
return(r);
}
int main ( .. ){
char *slist[2048];
[ ... ]
int lunghezza_file = lseek ( ordinato ,  0 , SEEK_END ) ;
//restituisce 0 in caso di successo...
lseek ( ordinato, 0, SEEK_SET ) ;
int red = read ( ordinato ,  slist , lunghezza_file );
       if (red == -1){
            perror ("la red è fallita \n");
                          }
[ ... ]
  size_t slsiz = sizeof(slist)/sizeof(slist[0]);
  qsort ( slist , slsiz , sizeof (slist[0]) , firstchar ) ;
  for (i = 0; i < slsiz; i++) ;
  printf("%s\n",slist[i]);
 ...
Ho fatto delle verifiche sul programma e non sembra darmi problemi fino
alla riga della sottrazione dove avviene un segmentation fault e non
capisco perchè...
ho provato anche con la strcmp ma è la stessa cosa.
Ringrazio tutti per l'aiuto che mi avete e mi state dando.
Stefano

> r = **cpp0 - **cpp1;  
sottrazione tra stringhe?
forse volevi fare:
r = **cpp0[0] - **cpp1[0]

RedWiz ha scritto:

ho provato anche ad usare la strcmp senza risultato
si si hai ragione ho sbagliato a scrivere...
io ho comunque scritto in questo modo r = *cpp0[0] - *cpp1[0] ...
correggendo ricevo sempre lo stesso problema di segmentation.

 
...l'ho scritto di getto e provato appena (se trovate errori postateli).
se ti va bene come esempio, modificalo come meglio credi...
ciao
/* ---------------------------- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ELEM 2048 /* limitato a MAX_ELEM parole */
int cb_comp(const void *p1, const void *p2)
{       if(!p1 || !p2 || !*(char **)p1 || !*(char **)p2)
                 return 0;
         return strcmp(*(char **)p1, *(char **)p2);
}
int main (void)
{
         char *slist[MAX_ELEM + 1]; /* l'ultimo elem. sara' un punt. 
NULL di fine lista */
         char szLine[4096]; /* caratteri x linea di testo */
         FILE *fp = NULL;
         int i, nWords = 0;
         memset(slist, 0, sizeof(slist));
         if(!(fp = fopen("file.txt", "r")))
                 return -1;
         for(nWords = 0; !feof(fp); )
         {       char *p, *pb;
                 if(!fgets(szLine, sizeof(szLine)-1, fp))
                         break;
                 /* strtok() modifica il buffer szLine */
                 for(pb = szLine; (p = strtok(pb, " \t\n\r")); pb = NULL)
                 {       if(nWords >= MAX_ELEM)
                                 break; /* finiti gli elementi */
                         if(!(slist[nWords] = strdup(p)))
                                 break; /* terminata la memoria */
                         nWords++;
                 }
         }
         fclose(fp);
         qsort(slist, nWords, sizeof(char *), cb_comp);
         for (i = 0; slist[i]; i++)
         {       printf("%s\n", slist[i]);
                 free(slist[i]);
         }
         return (0);
}
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com