Leggere solo una riga da un file in c

di il
56 risposte

56 Risposte - Pagina 3

  • Re: Leggere solo una riga da un file in c

    Funziona invece ho sbagliato io scusa
  • Re: Leggere solo una riga da un file in c

    Ultimo problema, poi ho definitivamente concluso.
    Ho il seguente codice:
    
    //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            printf("Inserisci luogo di nascita: ");
            scanf("%s", luogo);
            
            FILE * f = fopen ("" , "r");
            if ( !f ) return -1;
            
            char buffer [1024];
            
            int conta_righe, i;
            
            /* inizializzo il contatore */
            conta_righe = 0;
            
            while(fgets (buffer , 1024 , f) != NULL)
            {
                /* ho letto una riga: aumento il contatore */
                conta_righe++;
                
                /* elimino il carattere "a capo" al termine della riga  */
                i = 0;
                while(buffer[i] != '\n') i++;
                buffer[i] = '\0';
                
                /* confronto la stringa appena letta con il campione */
                if(strcmp(buffer, luogo) == 0)
                {
                    puts(buffer);
                    printf("Riga trovata: e' la numero %d.\n", conta_righe);
                    /* esco dal ciclo while. */
                    break;
                }
            }
            
            fclose(f);
            
            FILE * pf = fopen ("codici.txt" , "r");
            if ( !pf ) return -1;
            
            char buffer1 [1024];
            
            int riga_da_leggere;
            
            /* voglio leggere la riga in input */
            riga_da_leggere = conta_righe;
            
            /* inizializzo il contatore */
            i = 0;
            
            while(i != riga_da_leggere)
            {
                if(fgets (buffer1 , 1024 , pf) == NULL)
                {
                    printf("Fine del file raggiunta.\n");
                    return -1;
                }
                i++;
            }
            
            //view line
            printf("\n%s\n", buffer1);
            strcpy(luogo_cod, buffer1);
            puts(luogo_cod);
            fclose(pf);
        } else {
            //nato all'estero
            printf("Inserisci stato di nascita: ");
            scanf("%s", luogo);
            if (strcmp(luogo, "albania")==0)
                strcpy(luogo_cod,"z100");
            if (strcmp(luogo, "ucraina")==0)
                strcpy(luogo_cod,"z138");
            if (strcmp(luogo, "grecia")==0)
                strcpy(luogo_cod,"z115");
            if (strcmp(luogo, "polonia")==0)
                strcpy(luogo_cod,"z127");
        }
    
    Ecco i file .txt
    codici.txt
    l319
    l682
    b300
    f205
    d869
    h501
    prova.txt
    tradate
    varese
    busto
    milano
    gallarate
    roma

    Voglio copiare nella variabile luogo_cod il contenuto della variabile buffer, che contiene il codice catastale della città inserita dall'utente. Strcpy non lo copia, come mai? Grazie
  • Re: Leggere solo una riga da un file in c

    Il codice era corretto: semplicemente luogo_cod non era dichiarato (ma il compilatore non te lo segnalava?)

    Quindi abbiamo
    
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, const char * argv[])
    {
        FILE* f = fopen ("prova.txt" , "r");
        if ( !f ) return -1;
        
        char buffer [1024];
        
        int conta_righe, i;
        
        /* inizializzo il contatore */
        conta_righe = 0;
        
        while(fgets (buffer , 1024 , f) != NULL)
        {
        	/* ho letto una riga: aumento il contatore */
        	conta_righe++;
        	
        	/* elimino il carattere "a capo" al termine della riga */
        	i = 0;
        	while(buffer[i] != '\n') i++;
        	buffer[i] = '\0';
        	
        	/* confronto la stringa appena letta con il campione */
        	if(strcmp(buffer, "Gallarate") == 0)
        	{
        		printf("Riga trovata: e' la numero %d.\n", conta_righe);
        		/* esco dal ciclo while. Altrimenti si puo' anche utilizzare
        		un intero come flag... */
        		break;
        	}
        }
        
        fclose(f);
        
        FILE * pf = fopen ("codici.txt" , "r");
        if ( !pf ) return -1;
        
        char buffer1 [1024];
        char luogo_cod[1024];
        
        int riga_da_leggere;
        
        /* voglio leggere la riga in input */
        riga_da_leggere = conta_righe;
        
        /* inizializzo il contatore */
        i = 0;
        
        while(i != riga_da_leggere)
        {
            if(fgets (buffer1 , 1024 , pf) == NULL)
            {
                printf("Fine del file raggiunta.\n");
                return -1;
            }
            i++;
        }
        
        //view line
        printf("\n%s\n", buffer1);
        strcpy(luogo_cod, buffer1);
        puts(luogo_cod);
        fclose(pf);
        
        return 0;
    }
    
    
    P.S. Sono possibili alcune ottimizzazioni al codice, ma il problema è sostanzialmente risolto.
  • Re: Leggere solo una riga da un file in c

    Fabio97 se vuoi imparare, qui troverai tutti ben disposti ad aiutarti.

    Anzi, penso di parlare a nome di tutti quelli che in questo thread sono intervenuti, senza possibilità di smentite, se dovessero essercene allora quanto ti dico è una mia personale opinione.

    Per imparare devi essere disposto ad accettare i consigli, se il codice lo scriviamo noi tu impari sempre poco, e domani sarai ancora qui a chiedere le stesse cose. A noi piacerebbe che tu domani qui chiedessi cose nuove, che ci fosse un confronto tra chi il problema lo ha affrontato e che ha trovato una soluzione, sicuramente da correggere e migliorare.

    Te lo ripeto, di soluzioni per il problema ce ne sono diverse tante quanti sono gli iscritti al forum, ci piacerebbe che tu dessi il tuo contributo risolvendo i tuoi problemi e portando a casa una nuova competenza. Ecco a che serve un forum, ecco perchè è importante quando si risolve qualcosa dire ho risolto così. E' motivo di crescita anche per noi.

    Sappi che ogni problema risolto lo si può sempre migliorare, sotto tanti aspetti. Lessi una volta che per un programmatore un software non sarebbe mai stato distribuito, perchè ci sarebbero sempre nuove funzionalità e sempre nuove ottimizzazioi da fare.

    Spero tu possa accettare i nostri consigli evitando di voler risolver il problemino scolastico del momento, domani ne avrai uno sempre maggiore e non lo saprai affrontare. Non ritenerti soddisfatto del codice che qualcuno qui ti ha scritto, solo per poter dire ok ce l'ho e funziona, perchè hai solo consentito, nella migliore delle ipotesi a chi, lo ha fatto di ripassare qualcosa.

    Spero vivamente per te, a maggior ragione se il 97 nel tuo nick è la data di nascita, forse siamo tutti fratelli maggior ahimè, di accettare questo appunto e vederlo come stimolo per una vera crescita professionale. Se oggi fai uno sforzo in più per farti aiutare e, qui hai la possibilità di chiedere aiuto, sarai ripagato con gli interessi domani. Fidati!
  • Re: Leggere solo una riga da un file in c

    Ringrazio tutti, accetto i consigli ed oggi ho imparato cose nuove; comunque 97 è il mio anno di nascita.
  • Re: Leggere solo una riga da un file in c

    Ultimo problema. Ho il seguente codice che calcola il codice fiscale di una persona (riprende i codici precedenti).
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main(int argc, const char * argv[])
    {
        char cognome [30], cognome_cod[4], nome[30], nome_cod[5], anno[4], anno_cod[2], mese[10], mese_cod, giorno[3], sesso[2], conferma[2], luogo[30], luogo_cod[1024], codice[16], dispari[16], pari[16], carattere_controllo;
        int i2=0, giorno_int, val_pari=0, val_dispari=0, somma=0, resto=0;
        
        printf("Inserire cognome: ");
        scanf("%s", cognome);
        printf("Inserire nome: ");
        scanf("%s", nome);
        printf("Inserisci anno di nascita(aa): ");
        scanf("%s", anno);
        printf("Inserisci mese di nascita(lettere): ");
        scanf("%s", mese);
        printf("Inserisci sesso(m/f): ");
        scanf("%s", sesso);
        printf("Inserisci giorno di nascita(gg): ");
        scanf("%s", giorno);
        printf("Sei nato in Italia?(s/n): ");
        scanf("%s", conferma);
        
        //sviluppo calcoli per calcolare le lettere del cognome
        if (strlen(cognome)==2) {
            strcpy(cognome_cod,cognome);
            cognome_cod[2]='x';
        } else {
            for (int i=0; i<strlen(cognome); i++) {
                if (cognome[i]!='a' && cognome[i]!='e' && cognome[i]!='i' && cognome[i]!='o' && cognome[i]!='u') {
                    cognome_cod[i2]=cognome[i];
                    i2++;
                }
                if (i2>2)
                    break;
            }
            if (strlen(cognome_cod)<=2) {
                for (int i=0; i<strlen(cognome); i++) {
                    if (cognome[i]=='a' || cognome[i]=='e' || cognome[i]=='i' || cognome[i]=='o' || cognome[i]=='u') {
                        cognome_cod[2]=cognome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per calcolare le lettere del nome
        i2=0;
        if (strlen(nome)==2) {
            strcpy(nome_cod,nome);
            nome_cod[2]='x';
        } else {
            for (int i=0; i<strlen(nome); i++) {
                if (nome[i]!='a' && nome[i]!='e' && nome[i]!='i' && nome[i]!='o' && nome[i]!='u') {
                    nome_cod[i2]=nome[i];
                    i2++;
                }
                //spostare le lettere
                if (i2==4) {
                    nome_cod[0]=nome_cod[0];
                    for (int i=1; i<4; i++) 
                        nome_cod[i]=nome_cod[i+1];
                }
                if (i2>3)
                    break;
            }
            if (strlen(nome_cod)<=2) {
                for (int i=0; i<strlen(nome); i++) {
                    if (nome[i]=='a' || nome[i]=='e' || nome[i]=='i' || nome[i]=='o' || nome[i]=='u') {
                        nome_cod[2]=nome[i];
                        break;
                    }
                }
            }
        }
        
        //sviluppo calcoli per l'anno di nascita
        if (strlen(anno)==2) {
            strcpy(anno_cod, anno);
        } else {
            printf("\nAnno scritto nella forma errata!");
            return 0;
        }
            
        //sviluppo calcoli per il mese di nascita
        if(strcmp(mese,"gennaio")==0)
            mese_cod='a';
        if(strcmp(mese,"febbraio")==0)
            mese_cod='b';
        if(strcmp(mese,"marzo")==0)
            mese_cod='c';
        if(strcmp(mese,"aprile")==0)
            mese_cod='d';
        if(strcmp(mese,"maggio")==0)
            mese_cod='e';
        if(strcmp(mese,"giugno")==0)
            mese_cod='h';
        if(strcmp(mese,"luglio")==0)
            mese_cod='l';
        if(strcmp(mese,"agosto")==0)
            mese_cod='m';
        if(strcmp(mese,"settembre")==0)
            mese_cod='p';
        if(strcmp(mese,"ottobre")==0)
            mese_cod='r';
        if(strcmp(mese,"novembre")==0)
            mese_cod='s';
        if(strcmp(mese,"dicembre")==0)
            mese_cod='t';
        
        //sviluppo calcoli per il giorno di nascita
        //sesso di nascita
        if (strncmp(sesso,"f",2)==0) {
            //convertire giorno da stringa a intero
            giorno_int=atoi(giorno);
            //sommare 40 a giorno
            giorno_int+=40;
            //convertire giorn_int da intero a stringa
            sprintf(giorno,"%d", giorno_int);
        }
        
        //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            printf("Inserisci luogo di nascita: ");
            scanf("%s", luogo);
            
            FILE * f = fopen ("prova.txt" , "r");
            if ( !f ) return -1;
            
            char buffer [1024];
            
            int conta_righe, i;
            
            /* inizializzo il contatore */
            conta_righe = 0;
            
            while(fgets (buffer , 1024 , f) != NULL)
            {
                /* ho letto una riga: aumento il contatore */
                conta_righe++;
                
                /* elimino il carattere "a capo" al termine della riga  */
                i = 0;
                while(buffer[i] != '\n') i++;
                buffer[i] = '\0';
                
                /* confronto la stringa appena letta con il campione */
                if(strcmp(buffer, luogo) == 0)
                {
                    /* esco dal ciclo while. */
                    break;
                }
            }
            
            fclose(f);
            
            FILE * pf = fopen ("codici.txt" , "r");
            if ( !pf ) return -1;
            
            char buffer1 [1024];
            
            int riga_da_leggere;
            
            /* voglio leggere la riga in input */
            riga_da_leggere = conta_righe;
            
            /* inizializzo il contatore */
            i = 0;
            
            while(i != riga_da_leggere)
            {
                if(fgets (buffer1 , 1024 , pf) == NULL)
                {
                    printf("Fine del file raggiunta.\n");
                    return -1;
                }
                i++;
            }
            strcpy(luogo_cod, buffer1);
            fclose(pf);
        } else {
            //nato all'estero
            printf("Inserisci stato di nascita: ");
            scanf("%s", luogo);
            if (strcmp(luogo, "albania")==0)
                strcpy(luogo_cod,"z100");
            if (strcmp(luogo, "ucraina")==0)
                strcpy(luogo_cod,"z138");
            if (strcmp(luogo, "grecia")==0)
                strcpy(luogo_cod,"z115");
            if (strcmp(luogo, "polonia")==0)
                strcpy(luogo_cod,"z127");
        }
        
        //copiare i caratteri in una variabile codice fiscale
        i2=0;
        for (int i=0; i<3; i++)
            codice[i]=cognome_cod[i];
        for (int i=3; i<6; i++) {
            codice[i]=nome_cod[i2];
            i2++;
        }
        i2=0;
        for (int i=6; i<8; i++) {
            codice[i]=anno_cod[i2];
            i2++;
        }
        codice[8]=mese_cod;
        i2=0;
        for (int i=9; i<11; i++) {
            codice[i]=giorno[i2];
            i2++;
        }
        i2=0;
        for (int i=11; i<15; i++) {
            codice[i]=luogo_cod[i2];
            i2++;
        }
    
        //codice per il carattere di controllo
        int i_dispari=0, i_pari=0;
        for (int i=0; i<strlen(codice); i++) {
          //dividere i caratteri pari dai caratteri dispari
            if((i%2)==1) {
                //caratteri pari(parte dall'indice 0)
                pari[i_pari]=codice[i];
                i_pari++;
            } else {
                dispari[i_dispari]=codice[i];
                i_dispari++;
            }
        }
        //assegnare il valore ai caratteri pari
        for (int i=0; i<strlen(pari); i++) {
            if (pari[i] >= '0' && pari[i] <= '9')
                val_pari += pari[i] - '0';
            
            if (pari[i] >= 'a' && pari[i] <= 'z')
                val_pari += pari[i] - 'a';
        }
        
        //assegnare il valore ai caratteri dispari
        for (int i=0; i<strlen(dispari); i++) {
            if (strncmp(&dispari[i], "0", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "1", 1)==0)
                val_dispari+=0;
            if (strncmp(&dispari[i], "2", 1)==0)
                val_dispari+=5;
            if (strncmp(&dispari[i], "3", 1)==0)
                val_dispari+=7;
            if (strncmp(&dispari[i], "4", 1)==0)
                val_dispari+=9;
            if (strncmp(&dispari[i], "5", 1)==0)
                val_dispari+=13;
            if (strncmp(&dispari[i], "6", 1)==0)
                val_dispari+=15;
            if (strncmp(&dispari[i], "7", 1)==0)
                val_dispari+=17;
            if (strncmp(&dispari[i], "8", 1)==0)
                val_dispari+=19;
            if (strncmp(&dispari[i], "9", 1)==0)
                val_dispari+=21;
            if (strncmp(&dispari[i], "a", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "b", 1)==0)
                val_dispari+=0;
            if (strncmp(&dispari[i], "c", 1)==0)
                val_dispari+=5;
            if (strncmp(&dispari[i], "d", 1)==0)
                val_dispari+=7;
            if (strncmp(&dispari[i], "e", 1)==0)
                val_dispari+=9;
            if (strncmp(&dispari[i], "f", 1)==0)
                val_dispari+=13;
            if (strncmp(&dispari[i], "g", 1)==0)
                val_dispari+=15;
            if (strncmp(&dispari[i], "h", 1)==0)
                val_dispari+=17;
            if (strncmp(&dispari[i], "i", 1)==0)
                val_dispari+=19;
            if (strncmp(&dispari[i], "j", 1)==0)
                val_dispari+=21;
            if (strncmp(&dispari[i], "k", 1)==0)
                val_dispari+=2;
            if (strncmp(&dispari[i], "l", 1)==0)
                val_dispari+=4;
            if (strncmp(&dispari[i], "m", 1)==0)
                val_dispari+=18;
            if (strncmp(&dispari[i], "n", 1)==0)
                val_dispari+=20;
            if (strncmp(&dispari[i], "o", 1)==0)
                val_dispari+=11;
            if (strncmp(&dispari[i], "p", 1)==0)
                val_dispari+=3;
            if (strncmp(&dispari[i], "q", 1)==0)
                val_dispari+=6;
            if (strncmp(&dispari[i], "r", 1)==0)
                val_dispari+=8;
            if (strncmp(&dispari[i], "s", 1)==0)
                val_dispari+=12;
            if (strncmp(&dispari[i], "t", 1)==0)
                val_dispari+=14;
            if (strncmp(&dispari[i], "u", 1)==0)
                val_dispari+=16;
            if (strncmp(&dispari[i], "v", 1)==0)
                val_dispari+=10;
            if (strncmp(&dispari[i], "w", 1)==0)
                val_dispari+=22;
            if (strncmp(&dispari[i], "x", 1)==0)
                val_dispari+=25;
            if (strncmp(&dispari[i], "y", 1)==0)
                val_dispari+=24;
            if (strncmp(&dispari[i], "z", 1)==0)
                val_dispari+=23;
            if (strncmp(&dispari[i], "\0", 1)==0)
                val_dispari+=0;
        }
        
        //sommare i valori pari e i valori dispari
        somma=val_pari+val_dispari;
        //calcolare il resto dividendo per 26 il risultato
        resto=somma%26;
        //assegnare ad ogni valore da 0 a 25 il carattere corrispondente
        char a='a';
        for (int i=0; i<=25; i++) {
            if (resto==i) 
                carattere_controllo=a;
            a++;
        }
        
        codice[15]=carattere_controllo;
        
        //caratteri maiuscoli e stampa dell'output
        for (int i=0; i<codice[i]; i++) 
            codice[i]=toupper(codice[i]);
        
        printf("\n%s\nProgramma di Fabio", codice);
        return 0;
    }
    
    Ho inserito i miei dati:
    cognome, nome, etc...
    E mi stampa il mio codice fiscale correttamente
    F**FBA97*******Q
    solo che esso è seguito da luogo_cod.
    Quindi mi stampa
    F**FBA97*******QL319
    Come mai? Dove è l'errore? Grazie
  • Re: Leggere solo una riga da un file in c

    Se non sbaglio, prima c'era una doppia stampa: una con printf e una con puts. Il problema potrebbe essere quello, anche se ora non ho il tempo di controllare tutto il codice.
  • Re: Leggere solo una riga da un file in c

    Ho cancellato tutte le doppie stampe
  • Re: Leggere solo una riga da un file in c

    Lasciate perdere ... tutti quanti ...
  • Re: Leggere solo una riga da un file in c

    Perché? Dica
  • Re: Leggere solo una riga da un file in c

    Per favore ho solo bisogno di sistemare quest'ultimo problemino, poi ho finito
  • Re: Leggere solo una riga da un file in c

    Io, al momento, non ho assolutamente tempo di analizzare tutto il codice.
    Però tu, che alla fine sei quello che deve risolvere il problema, potresti:
    1. analizzare il codice
    2. inserire qualche stampa di debug (ad esempio la stampa dei singoli pezzi del codice fiscale)
    3. provare
    4. eventualmente tornare al passo (1) fino a quando non risolvi

    La programmazione non è quasi mai straightforward: bisogna sbatterci la testa!
  • Re: Leggere solo una riga da un file in c

    minomic ha scritto:


    bisogna sbatterci la testa!
    Era quello che intendevo Fabio ...
  • Re: Leggere solo una riga da un file in c

    Fabio,
    aggiungo che di tutto quello che abbiamo detto in tutti i thread, hai fatto tue poche cose, se non niente.

    L'errore nel tuo codice, che se mi permetti, non offenderti, io capisco che vuoi imparare e ti ribadisco che non è il modo per farlo, fa schifo.
    E' un'unico monoblocco, non c'è una funzione, è impossibile comprendere codice scritto così. Prima di scrivere dovresti fare un minimo di ingegnerizzazione. Dirai io non sono ingegnere, ma puoi provare a ragionare e ti rendi conto che poi gli ingegneri in fondo ragionano prima di mettersi li a scrivere righe di codice, molte volte inutili. Se si è pensato bene al problema, si risparmia tempo, si guadagna in efficienza, ecc...

    Per scrivere programmi è importante compiere questi passi, prima di ogni cosa.

    Vedila in questi termini con il tuo esempio:
    Problema generare il codice fiscale, allora mi documento:
    http://it.wikipedia.org/wiki/Codice_fiscal
    scoprirai che in realtà il codice fiscale sebbene sarai in grado di generarlo non è detto che è quello che ti attribuisce l'agenzia delle entrate, perchè non puoi gestire i casi di omocodie.

    Poi, vedi che cosa ti serve come strutture dati. Tu non ne utilizzi una che è veramente utile per un programma efficiente.

    Poi deleghi a funzioni, cioè dividi il progamma in piccoli pezzettini, così il programma risulterà ordinato, il codice risulterà più snello e facilmente manutenibile e debuggabile, anche da chi non lo ha scritto.

    Dopo aver pensato così a grandi linee, puoi cominciare su carta a disegnarti i vari pezzi di programma, non vergognarti di fare disegni stupidi, ragionamenti elementari, lo fanno anche gli ingegneri.

    Poi cominci a scrivere il codice e, anzitutto cominci dai commenti di massima e solo dopo avere avuto un programma completo di commenti di alto livello, cominci a scrivere le funzioni, che puoi debuggare a parte scrivendo spike ad hoc.

    So ce ti sembro un folle, ma così ci perdi molto molto molto meno tempo di quanto tu non possa immaginare.

    P.s.
    Non pensare che se impari a fare questo puoi chiamarti ingegnere, ma metti solide abitudini per poterlo diventare forse un giorno.

    Ciò premesso, ecco quello che tu vuoi sentirti dire:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main(int argc, const char * argv[])
    {
        char cognome [30], cognome_cod[4], nome[30], nome_cod[5], anno[4], anno_cod[2];
        char mese[10], mese_cod, giorno[3], sesso[2], conferma[2], luogo[30], luogo_cod[5];
        char codice[16], dispari[16], pari[16], carattere_controllo;
        int i2=0, giorno_int, val_pari=0, val_dispari=0, somma=0, resto=0;
    
        int i;
    
        printf("Inserire cognome: ");
        scanf("%s", cognome);
        printf("Inserire nome: ");
        scanf("%s", nome);
        printf("Inserisci anno di nascita(aa): ");
        scanf("%s", anno);
        printf("Inserisci mese di nascita(lettere): ");
        scanf("%s", mese);
        printf("Inserisci sesso(m/f): ");
        scanf("%s", sesso);
        printf("Inserisci giorno di nascita(gg): ");
        scanf("%s", giorno);
        printf("Sei nato in Italia?(s/n): ");
        scanf("%s", conferma);
    
        //sviluppo calcoli per calcolare le lettere del cognome
        if (strlen(cognome)==2) {
            strcpy(cognome_cod,cognome);
            cognome_cod[2]='x';
        } else {
            for (i=0; i<strlen(cognome); i++) {
                if (cognome[i]!='a' && cognome[i]!='e' && cognome[i]!='i' && cognome[i]!='o' && cognome[i]!='u') {
                    cognome_cod[i2]=cognome[i];
                    i2++;
                }
                if (i2>2)
                    break;
            }
            if (strlen(cognome_cod)<=2) {
                for (i=0; i<strlen(cognome); i++) {
                    if (cognome[i]=='a' || cognome[i]=='e' || cognome[i]=='i' || cognome[i]=='o' || cognome[i]=='u') {
                        cognome_cod[2]=cognome[i];
                        break;
                    }
                }
            }
        }
    
        //sviluppo calcoli per calcolare le lettere del nome
        i2=0;
        if (strlen(nome)==2) {
            strcpy(nome_cod,nome);
            nome_cod[2]='x';
        } else {
            for (i=0; i<strlen(nome); i++) {
                if (nome[i]!='a' && nome[i]!='e' && nome[i]!='i' && nome[i]!='o' && nome[i]!='u') {
                    nome_cod[i2]=nome[i];
                    i2++;
                }
                //spostare le lettere
                if (i2==4) {
                    nome_cod[0]=nome_cod[0];
                    for (i=1; i<4; i++)
                        nome_cod[i]=nome_cod[i+1];
                }
                if (i2>3)
                    break;
            }
            if (strlen(nome_cod)<=2) {
                for (i=0; i<strlen(nome); i++) {
                    if (nome[i]=='a' || nome[i]=='e' || nome[i]=='i' || nome[i]=='o' || nome[i]=='u') {
                        nome_cod[2]=nome[i];
                        break;
                    }
                }
            }
        }
    
        //sviluppo calcoli per l'anno di nascita
        if (strlen(anno)==2) {
            strcpy(anno_cod, anno);
        } else {
            printf("\nAnno scritto nella forma errata!");
            return 0;
        }
    
        //sviluppo calcoli per il mese di nascita
        if(strcmp(mese,"gennaio")==0)
            mese_cod='a';
        if(strcmp(mese,"febbraio")==0)
            mese_cod='b';
        if(strcmp(mese,"marzo")==0)
            mese_cod='c';
        if(strcmp(mese,"aprile")==0)
            mese_cod='d';
        if(strcmp(mese,"maggio")==0)
            mese_cod='e';
        if(strcmp(mese,"giugno")==0)
            mese_cod='h';
        if(strcmp(mese,"luglio")==0)
            mese_cod='l';
        if(strcmp(mese,"agosto")==0)
            mese_cod='m';
        if(strcmp(mese,"settembre")==0)
            mese_cod='p';
        if(strcmp(mese,"ottobre")==0)
            mese_cod='r';
        if(strcmp(mese,"novembre")==0)
            mese_cod='s';
        if(strcmp(mese,"dicembre")==0)
            mese_cod='t';
    
        //sviluppo calcoli per il giorno di nascita
        //sesso di nascita
        if (strncmp(sesso,"f",2)==0) {
            //convertire giorno da stringa a intero
            giorno_int=atoi(giorno);
            //sommare 40 a giorno
            giorno_int+=40;
            //convertire giorn_int da intero a stringa
            sprintf(giorno,"%d", giorno_int);
        }
    
        //sviluppo calcoli per il luogo
        if (strncmp(conferma, "s", 2)==0) {
            printf("Inserisci luogo di nascita: ");
            scanf("%s", luogo);
    
            FILE * f = fopen ("prova.txt" , "r");
            if ( !f ) return -1;
    
            char buffer [1024];
    
            int conta_righe, i;
    
            /* inizializzo il contatore */
            conta_righe = 0;
    
            while(fgets (buffer , 1024 , f) != NULL)
            {
                /* ho letto una riga: aumento il contatore */
                conta_righe++;
    
                /* elimino il carattere "a capo" al termine della riga  */
                i = 0;
                while(buffer[i] != '\n') i++;
                buffer[i] = '\0';
    
                /* confronto la stringa appena letta con il campione */
                if(strcmp(buffer, luogo) == 0)
                {
                    /* esco dal ciclo while. */
                    break;
                }
            }
    
            fclose(f);
    
            FILE * pf = fopen ("codici.txt" , "r");
            if ( !pf ) return -1;
    
            char buffer1 [1024];
    
            int riga_da_leggere;
    
            /* voglio leggere la riga in input */
            riga_da_leggere = conta_righe;
    
            /* inizializzo il contatore */
            i = 0;
    
            while(i != riga_da_leggere)
            {
                if(fgets (buffer1 , 1024 , pf) == NULL)
                {
                    printf("Fine del file raggiunta.\n");
                    return -1;
                }
                buffer1[strlen(buffer1)-1]='\0';
                i++;
            }
            strcpy(luogo_cod, buffer1);
            fclose(pf);
        } else {
            //nato all'estero
            printf("Inserisci stato di nascita: ");
            scanf("%s", luogo);
            if (strcmp(luogo, "albania")==0)
                strcpy(luogo_cod,"z100");
            if (strcmp(luogo, "ucraina")==0)
                strcpy(luogo_cod,"z138");
            if (strcmp(luogo, "grecia")==0)
                strcpy(luogo_cod,"z115");
            if (strcmp(luogo, "polonia")==0)
                strcpy(luogo_cod,"z127");
        }
    
        //copiare i caratteri in una variabile codice fiscale
        i2=0;
        for (i=0; i<3; i++)
            codice[i]=cognome_cod[i];
        for (i=3; i<6; i++) {
            codice[i]=nome_cod[i2];
            i2++;
        }
        i2=0;
        for (i=6; i<8; i++) {
            codice[i]=anno_cod[i2];
            i2++;
        }
        codice[8]=mese_cod;
        i2=0;
        for (i=9; i<11; i++) {
            codice[i]=giorno[i2];
            i2++;
        }
        i2=0;
        for (i=11; i<15; i++) {
            codice[i]=luogo_cod[i2];
            i2++;
        }
    
        //codice per il carattere di controllo
        int i_dispari=0, i_pari=0;
        for (i=0; i<strlen(codice); i++) {
          //dividere i caratteri pari dai caratteri dispari
            if((i%2)==1) {
                //caratteri pari(parte dall'indice 0)
                pari[i_pari]=codice[i];
                i_pari++;
            } else {
                dispari[i_dispari]=codice[i];
                i_dispari++;
            }
        }
        //assegnare il valore ai caratteri pari
        for (i=0; i<strlen(pari); i++) {
            if (pari[i] >= '0' && pari[i] <= '9')
                val_pari += pari[i] - '0';
    
            if (pari[i] >= 'a' && pari[i] <= 'z')
                val_pari += pari[i] - 'a';
        }
    
        //assegnare il valore ai caratteri dispari
        for (i=0; i<strlen(dispari); i++) {
            if (strncmp(&dispari[i], "0", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "1", 1)==0)
                val_dispari+=0;
            if (strncmp(&dispari[i], "2", 1)==0)
                val_dispari+=5;
            if (strncmp(&dispari[i], "3", 1)==0)
                val_dispari+=7;
            if (strncmp(&dispari[i], "4", 1)==0)
                val_dispari+=9;
            if (strncmp(&dispari[i], "5", 1)==0)
                val_dispari+=13;
            if (strncmp(&dispari[i], "6", 1)==0)
                val_dispari+=15;
            if (strncmp(&dispari[i], "7", 1)==0)
                val_dispari+=17;
            if (strncmp(&dispari[i], "8", 1)==0)
                val_dispari+=19;
            if (strncmp(&dispari[i], "9", 1)==0)
                val_dispari+=21;
            if (strncmp(&dispari[i], "a", 1)==0)
                val_dispari+=1;
            if (strncmp(&dispari[i], "b", 1)==0)
                val_dispari+=0;
            if (strncmp(&dispari[i], "c", 1)==0)
                val_dispari+=5;
            if (strncmp(&dispari[i], "d", 1)==0)
                val_dispari+=7;
            if (strncmp(&dispari[i], "e", 1)==0)
                val_dispari+=9;
            if (strncmp(&dispari[i], "f", 1)==0)
                val_dispari+=13;
            if (strncmp(&dispari[i], "g", 1)==0)
                val_dispari+=15;
            if (strncmp(&dispari[i], "h", 1)==0)
                val_dispari+=17;
            if (strncmp(&dispari[i], "i", 1)==0)
                val_dispari+=19;
            if (strncmp(&dispari[i], "j", 1)==0)
                val_dispari+=21;
            if (strncmp(&dispari[i], "k", 1)==0)
                val_dispari+=2;
            if (strncmp(&dispari[i], "l", 1)==0)
                val_dispari+=4;
            if (strncmp(&dispari[i], "m", 1)==0)
                val_dispari+=18;
            if (strncmp(&dispari[i], "n", 1)==0)
                val_dispari+=20;
            if (strncmp(&dispari[i], "o", 1)==0)
                val_dispari+=11;
            if (strncmp(&dispari[i], "p", 1)==0)
                val_dispari+=3;
            if (strncmp(&dispari[i], "q", 1)==0)
                val_dispari+=6;
            if (strncmp(&dispari[i], "r", 1)==0)
                val_dispari+=8;
            if (strncmp(&dispari[i], "s", 1)==0)
                val_dispari+=12;
            if (strncmp(&dispari[i], "t", 1)==0)
                val_dispari+=14;
            if (strncmp(&dispari[i], "u", 1)==0)
                val_dispari+=16;
            if (strncmp(&dispari[i], "v", 1)==0)
                val_dispari+=10;
            if (strncmp(&dispari[i], "w", 1)==0)
                val_dispari+=22;
            if (strncmp(&dispari[i], "x", 1)==0)
                val_dispari+=25;
            if (strncmp(&dispari[i], "y", 1)==0)
                val_dispari+=24;
            if (strncmp(&dispari[i], "z", 1)==0)
                val_dispari+=23;
            if (strncmp(&dispari[i], "\0", 1)==0)
                val_dispari+=0;
        }
    
        //sommare i valori pari e i valori dispari
        somma=val_pari+val_dispari;
        //calcolare il resto dividendo per 26 il risultato
        resto=somma%26;
        //assegnare ad ogni valore da 0 a 25 il carattere corrispondente
        char a='a';
        for (i=0; i<=25; i++) {
            if (resto==i)
                carattere_controllo=a;
            a++;
        }
    
        codice[15]=carattere_controllo;
    
        codice[16]='\0';
    
        //caratteri maiuscoli e stampa dell'output
        for (i=0; i<codice[i]; i++)
            codice[i]=toupper(codice[i]);
    
        printf("\n%s\nProgramma di Fabio", codice);
        return 0;
    }
    
    Il problema, anche se te l'ho detto diverse volte e non hai capito è, che una stringa va completata sempre con '\0'. Con questi aggiustamenti il programma non fa più quello che dicevi.

    Comunque il programma non funziona, per esempio con giorni di nascita da 1 a 9.

    Adesso dimmi per curiosità, la tua prima riga di codice è stata questa:
    
    printf("\n%s\nProgramma di Fabio", codice);
    E' giusto essere orgogliosi e dire questo l'ho fatto io, ma attento che quello non può essere il tuo primo pensiero.

    Adesso, fai vedere a tutti che hai capito la lezione, risistemati il programma, primo che funzioni con tutte le date, poi con tutti i comuni d'italia i codici li trovi su internet, con cognomi e nomi multipli, cognomi senza nome, ecc...
    Fai in modo che l'utente, che è mediamente stupido, possa scrivere tutto in maiuscolo, minuscolo, metà e metà, ecc...
    Poi ristrutturati il codice come ti ho detto: ma è VIETATO chiedere per ogni cosa. Quando le cose non riuscirai a farle chiedi consigli a noi, ti ripeto tutti hanno voglia di aiutarti. Ma consigli non significa trovami l'errore, non funziona scrivi correttamente, ecc... Devi imparare a capire quello che vuoi fare, quello che hai fatto e cosa c'è che non va! Usa un debug, semina stampe di debug lungo tutto il codice, scrivi spike, inventati cose strane, ma impara a comprendere cosa non funziona.

    Adesso al Lavoro!!!
  • Re: Leggere solo una riga da un file in c

    E speriamo bene...
Devi accedere o registrarti per scrivere nel forum
56 risposte