Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6

    Ordinare alfabeticamente delle parole lette da file.txt [ C ]

    Salve a tutti, sono nuovo del forum e ho deciso di iscrivermi perchè ho più volte trovato soluzione ai miei dubbi seguendo vostre vecchie discussioni, ma ora ho bisogno di voi(Se c'è una sezione di presentazione linkate pure se è prassi ). Di seguito vi linko il mio codice che è suddiviso in 7 richieste anche se qui ne sono presenti solo 4, il problema che mi ha bloccato è presente nel punto 4 "case 4:" cioe nell'ordinamento alfabetico delle parole presenti in un file.txt che io devo andare a leggere... Qualcuno di voi sarebbe così gentile da aiutarmi? Voglio capire il procedimento...
    P.s.
    I primi 3 punti sono funzionanti. Per provare il codice basta compilare ed eseguire il programma su cygwin ----- > gcc main.c -o main.exe -----> ./main.exe file.txt

    Ecco il codice:

    codice:
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    
    
    //Prototipi delle funzioni
    void checkFile(FILE *pFile);
    void stampaFileAVideo(FILE *pFile);
    void copiaFile(FILE *pFile);
    
    void main(int argc, char *argv[]){
        
        
        FILE *pFile= fopen(argv[1], "r");
        int scelta;
        
        
        //Controllo se i parametri passati sono effettivamente 2, nome programma e file txt
        if(argc<2){
            printf("\n\n\nErrore nel passaggio dei parametri... \n");
            printf("Ritenta l'inserimento e riprova ad eseguire... \n\n\n");
            exit(1);
        }
        
        
        //Controlla eventuali errori sul passaggio del file txt al programma in cygwin
        if(pFile==NULL){
                printf("\n\n\nErrore nel passaggio del file txt dal quale leggere! \n");
                printf("Probabile errore grammaticale o di omissione di un file txt... \n\n\n");
                exit(1);
            }
        
        
        printf("\n*************************** Operazioni su file .txt disponibili ***************************\n\n\n");
        printf("1) Controlla se il file .txt e' vuoto o no\n");
        printf("2) Stampa a video il contenuto del file .txt\n");
        printf("3) Duplica il file .txt\n");
        printf("4) Ordina il contenuto del file .txt in modo alfabetico\n");
        printf("\n\n\nInserisci la tua scelta e premi 'Invio' ---> ");
        scanf("%d", &scelta);
        
        switch(scelta){
            
            case 1:
                
                printf("\n\n\n\n\n*************************** Stato del file .txt ***************************\n\n");
                checkFile(pFile);
                break;
            
            
            case 2:    
            
                printf("\n\n\n\n\n*************************** Contenuto del file .txt ***************************\n\n");
                stampaFileAVideo(pFile);
                printf("\n\n");
                break;
                
                
            case 3:
            
                printf("\n\n\n\n\n*************************** Duplicazione del file .txt ***************************\n\n");
                printf("Il file da copiare e' parole.txt passato da shell...\n\n\n");
                
                copiaFile(pFile);
        
                break;
                
            
            case 4:
                
                printf("\n\n\n\n\n************ Ordinamento alfabetico del file .txt ********\n\n");
                printf("********* Contenuto del file non ordinato *********\n\n");
                stampaFileAVideo(pFile);
                printf("\n\n\n\n********* Contenuto del file ordinato in modo alfabetico *****\n\n");
                stampaFileOrdinatoAVideo(parametro/i); //ad esempio
    //Ora io qui avevo pensato di creare una versione modifica di "stampaFileAVideo" che
    //però stampa a video un elenco ordinato alfabeticamente, ma non la so fare...
    
    
        }
        
        //Chiude il file
        fclose(pFile);
    }
    
    
    //Controlla se il file passato da shell è vuoto o contiene caratteri
    void checkFile(FILE *pFile){
            
            
            char c= getc(pFile);
            
            if(feof(pFile)){
                printf("\nIl file .txt e' vuoto...\n\n\n");
                exit(1);
            } else {
                printf("\nIl file .txt non e' vuoto\n\n\n");
                exit(1);
            }
    }
    
    
    
    //Stampa il contenuto del file .txt a video 
    void stampaFileAVideo(FILE *pFile){
        
        char *buffer;  //Oppure buffer[200]
        char *parolaLetta;
        
        while(1){
            parolaLetta=fgets(buffer, 200, pFile);
            if( parolaLetta==NULL )
            break;
            printf("%s", buffer);
        }
            
    }
    
    
    //Copia il file che passo come parametro in un secondo file.txt del quale specifico il nome
    void copiaFile(FILE *pFile){
        
        char tf[100], ch;
        FILE *pFileOut;
        
        printf("Inserisci il nome del file in cui copiare parole.txt(non dimenticare l'estensione): ");
        scanf("%s",tf);
        pFileOut=fopen(tf, "w");                    
                 
        while( ( ch = getc(pFile) ) != EOF )
                putc(ch, pFileOut);
                printf("\n\n\n\nIl file e' stato copiato con successo!\n");
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Carichi il file in un vettore di stringhe, lo ordini e lo riscrivi sul file.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Carichi il file in un vettore di stringhe, lo ordini e lo riscrivi sul file.
    Ciao, ho provato qualcosa del genere ma mi da segmentation fault... mi puoi aiutare?

    codice:
    void stampaFileOrdinatoAVideo(FILE *pFile){
        
        char buffer[200], temp;
        char parolaLetta[200];
        
        int i, j;
        
        while(1){
            fgets(buffer, 200, pFile);
            strcpy(parolaLetta, buffer);
            
            if( parolaLetta==NULL )
            break;
            
            if(parolaLetta[j]>parolaLetta[j+1])
                    {
                        temp=parolaLetta[j];
                        parolaLetta[j]=parolaLetta[j+1];
                        parolaLetta[j+1] =temp;
                    }
            
            printf("%s", temp);
        }
            
    }
    Piccola modifica...
    nel secondo "if" ci dovrebbe andare la funzione "strcmp" e no "<" o ">"
    Ultima modifica di Tekken3; 11-02-2016 a 11:16

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima devi fare la lettura e dopo l'ordinamento, non contemporaneamente... E per il confronto devi usare strcmp
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Prima devi fare la lettura e dopo l'ordinamento, non contemporaneamente... E per il confronto devi usare strcmp
    Scusami se ti disturbo... Dato che sono leggermente in alto mare con il C, mi potresti guidare psso passo con il codice? Quando vado a scrivere del codice(o pseudocodice su carta e poi traduco) vengono sempre fuori mille errori perchè non capisco bene come agire... Se mi guidi nella stesura di questa funzione (ripeto, il codice piu facile è e meglio è) ti ringrazio anticipatamente

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6
    Ho notato anche un altra anomalia... quando vado a richiamare la funzione "stampaFileOrdinatoAVideo(pFile);" che ovviamente andrà solo a leggere il file e no ad ordinarlo, ecco che quest'ultima non funziona anche se la fase di lettura è la copia spiccicata di "stampaFileAVideo(pFile);". Come mai?

    codice:
    case 4:
                
                printf("\n\n\n\n\n***** Ordinamento alfabetico del file .txt *****\n\n");
                printf("***** Contenuto del file non ordinato *****\n\n");
                stampaFileAVideo(pFile);  ------->Stampa
                printf("\n\n\n\n***** Contenuto del file ordinato in modo alfabetico *****\n\n");
                stampaFileOrdinatoAVideo(pFile); ---------> Non fa niente pur avendo la parte di lettura identica
                break;

    N.B.
    La funzione stampaFileOrdinatoAVideo(pFile); non è come quelal che ho postato sopra, ma ha solo la parte di lettura
    Ultima modifica di Tekken3; 12-02-2016 a 18:20

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6
    Un altro problema... Quando vado a controllare un occorrenza nel file mi da segmentation fault prima di "trovata= strstr(ch, parola);"
    Il prototipo è:
    codice:
    void ricercaParolaNelFile(FILE *pFile, char *parola);
    Alloco memoria per "parola":
    codice:
    char *parola= (char *) malloc (100*sizeof(char));
    La vado a leggere da tastiera:
    codice:
    scanf("%s", &parola);
    Richiamo la funzione così:
    codice:
    ricercaParolaNelFile(pFile, parola);
    Corpo della funzione che viene letto fino a "printf("4 ok\n");", dopodichè, segmentation fault...
    codice:
    void ricercaParolaNelFile(FILE *pFile, char *parola){
        printf("1  ok\n");
        char ch;
        printf("2   ok\n");
        char *trovata= (char *) malloc (100*sizeof(char));
        printf("3   ok\n");
        
        
        while( ( ch = getc(pFile) ) != EOF ){
            printf("4   ok\n");
            trovata= strstr(ch, parola);
            printf("5   ok\n");
        }
                if(trovata==NULL){
                    printf("\n\n\nParola non trovata...");
                    exit(1);
                } else {
                    printf("\n\n\nParola trovata... ");
                    exit(1);
                }
    }
    Cosa ne pensate? Quale puo essere il problema?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    6
    Nessuno che mi aiuta?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.