Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11

    ordinamento in un file di testo in C

    Ciao, ho un problema con l'ordinamento delle stringhe in un file.
    Ho un file di testo ordinato in ordine alfabetico, tale file è un dizionario. Io dovrei inserire delle parole in questo dizionario, il problema è che nn riesco ad inserire in ordine alfabetico ma vengono inserite alla fine del file e non ho idea di come posso ordinare un file.
    Ho provato a copiare il file in una lista ma è troppo grande, ci mette più di un'ora per eseguire tutto il programma.
    Vi posto il codice che ho utilizzato per l'inserimento delle parole nel file:

    Codice PHP:
    #include<stdio.h> 
    #include<stdlib.h>
    #include<string.h>         
    main() 
    {            
          
    char vocabolo[40];       
          
    char parola[40];       
          
    char scelta;
          
    FILE *fp;
          
    printf("Inserire parola:\n");
          
    scanf("%s"parola);
          if((
    fp fopen("zingarelli2005.txt""r+")) == NULL)
          
    printf("Impossibile aprire il file.\n");
          else{    
          while(!
    feof(fp)){ 
                  
    fscanf(fp"%s"vocabolo);
                  if(
    strcmp(parolavocabolo) == 0){    
                        
    printf("\ntrovata\n");                
                        break;                                     }                                       
                         }
                       if(
    strcmp(parolavocabolo) != 0){
                              
    printf("parola non trovata\n");   
                              
    printf("vuoi inserire la parola(Y/N)?\n");  
                              
    scanf("%c%c", &scelta, &scelta);   
                              if(
    scelta == 'Y')
                                      
    fprintf(fp"%s\n"parola);
                                      }
                     
    fclose(fp); 
               }    
              
    system("PAUSE");
               return 
    0;  
                } 

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao . . . Potresti allegare tutto il codice sorgente e il dizionario (ovviamente in un rar) ??? Vorrei rendermi conto. . .

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    scusa nn riesco ad allegare il file e il dizionario. Il dizionario lo puoi prendere da qui:
    http://www.matematica.unile.it/inseg...gli.php?id=233
    il codice sorgente è quello che ti ho scritto a meno che tu non ti riferivi a quello per copiare il file nella lista. Comunque riprovo ad allegare

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    I dati in un file di testo si possono solo accodare, non inserire a piacimento dove si vuole.
    Se sei vincolato ai file di testo hai questo limite, altrimenti è meglio usare un database (sqlite ad esempio).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    guarda, ho letto un pò il problema sul link che hai postato, e mi sa che se ti hanno dato questo da fare in C, devi per forza leggere e memorizzare tutto il file in memoria...e poi effettuare ricerche su quello! alla fine basta una lista, effettui una ricerca sulla lista contenente il dizionario per verificare se la parola esiste o no, nel caso non esistesse...inserisci nella lista e riordini, certo in maniera efficiente altrimenti ci metti una vita!! oppure, se non si vuole adottare questa strategia, ci sono le funzione di lettura/scrittura su file come la fread(), fwrite(), fseek(), lseek() e altre, che permettono di accedere in maniera non sequenziale!, però iniziamo a complicarci la vita per l'utilizzo di queste funzioni!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    ho provato ad inserire il file in lista ma ha impiegato 1h e 25 min per effettuare l'inserimento. Ti posto il codice che ho usato. A meno che non ho commesso qualche errore che rallenta l'esecuzione non credo sia il metodo migliore da usare. Con il file sequenziale, anche se non riesco ad ordinarlo, è errato?

    Codice PHP:
    #include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h>  
    struct lista{        
    char stringa[30];        
    struct lista *pun;        
    }; 
     
    /* dichiarazione delle funzioni */ 
    void letturaFile(FILE *, struct lista **); 
    void inserimento(struct lista **, char *); 
    void stampaLista(struct lista *);  

    main() {       
    FILE *f;       
    struct lista *NULL;              

    letturaFile(f, &p);              
    stampaLista(p);              
    system("PAUSE");              
    return 
    0;              
    }       
     
    /* definizione funzioni */  
    void letturaFile(FILE *fstruct lista **p
    {      
    char parola[20];      
    if(( 
    fopen("zingarelli2005.txt""r")) == NULL)           
    printf("Impossibile aprire il file\n");      
    else{           
    while(!
    feof(f)){                
    fscanf(f"%s"parola);                
    inserimento(pparola);                
    }                
    }      
    fclose(f); 
    }  

    void inserimento(struct lista **pchar *value
    {      
    struct lista *p0, *p1, *p2;            
    p0=(struct lista *)malloc(sizeof(struct lista));   
    if(
    p0 != NULL){
    strcpy(p0->stringavalue);         
    p0->pun NULL;                         
    p1 NULL;         
    p2 = *p;               
    while(
    p2 != NULL && strcmp(valuep2->stringa) > 0){
    p1 p2;                                 
    p2 p2->pun;                          
    }         
    if(
    p1 == NULL){            
    p0->pun = *p;            
    *
    p0;            
    }        
    else{              
    p1->pun p0;              
    p0->pun p2;              
    }              
    }         
    else             
    printf("%s nn inserito. Memoria nn disponibile\n"); 
    }  

    void stampaLista(struct lista *p2
    {      
    if(
    p2 == NULL)                    
    printf("la lista e' vuota\n");      
    else{           
    printf("la lista e':\n");                      
    while(
    p2 != NULL){                            
    printf("%s\n"p2->stringa);                            
    p2 p2->pun;                            }                                       
    printf("NULL\n\n");           
    }


  7. #7
    ho un idea, ma non sò se a te può andare bene....

    tu scrivi tutto il file, e poi dopo che hai finito lanci un comando del prompt dei comandi che si chiama sort passandogli il nome del file e ci pensa lui ad ordinarti il contenuto di tale file alfabeticamente. ci impiega circa 1 secondo a far tutto...
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  8. #8
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    tu scrivi tutto il file, e poi dopo che hai finito lanci un comando del prompt dei comandi che si chiama sort passandogli il nome del file e ci pensa lui ad ordinarti il contenuto di tale file alfabeticamente. ci impiega circa 1 secondo a far tutto...
    si ma quello che dici tu stampa solo il file ordinato a video, però non lo riscrive sul file!
    io invece come idea avevo quella di adottare sempre una lista, però di inserire sempre in coda, dato che tu leggi le parole in ordine alfabetico! quindi ti tieni un puntatore all'ultimo elemento e la nuova parola la inserisci alla fine! e poi riordini il tutto solo se hai inserito una nuova parola, altrimenti che bisogno c'è!!
    spero di essere stato chiaro sulle mie idee...
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  9. #9
    Utente di HTML.it L'avatar di frznn
    Registrato dal
    Apr 2008
    Messaggi
    108
    se stai su linux potresti redirigere l'output della sort in un file...ossia invece di stamparlo a video lo stampa in un file
    *** Rock n' Roll ain't noise pollution ***

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    ho usato l'inserimento in coda, funziona perfettamente. grazie mille.
    Vorrei chiedervi un ultimo aiuto.
    Come posso definire la "distanza" tra due parole?
    Se io inserisco una parola che non esiste nel dizionario, il programma deve visualizzarmi dei suggerimenti. Devo definire una funzione che mi dice quali parole visualizzare come suggerimenti.
    Ho provato ad usare strncmp però nn ottengo ciò che mi serve. Devo fare una scansione carattere per carattere?
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.