Problema con sscanf

di il
4 risposte

Problema con sscanf

Ciao ragazzi,come da titolo ho un problema con questa funzione.Sto provando a risolvere un esercizio
ma mi da problemi,forse sarò io...

L'esercizio che sto facendo opera su due file.
Nel primo,su ciascuna riga vi sono un elenco di dati di uno studente. Per semplicità ho scritto soltanto nome,cognome e anno di nascita.

La richiesta del problema è che copi nel secondo file tutte le righe,cioè i dati degli studenti,che non sono nati nel 1998.

Il mio ragionamento è questo:con una fgets leggo una singola riga per volta ed estraggo l'unico intero contenuto,cioè l'anno di nascita.
Se l'anno è diverso da 1998 lo copio.


Allego primo file e codice:



Nel primo file ho scritto:
Mario Rossi 1997
Luca Antonini 1998
Loris Capirossi 1994
Valentino Rossi 1990
Annibale Asdubale 1998
Andrea Gomez 1992





#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp1,*fp2;
    char buffer[100];
    int anno=0;

    fp1=fopen("primo.txt","r");

    if(fp1==NULL){
        printf("\nErrore in apertura file\n\n");
        exit(EXIT_FAILURE);
    }

    fp2=fopen("secondo.txt","w");

    if(fp2==NULL){
        printf("\nErrore in apertura file\n\n");
        exit(EXIT_FAILURE);
    }

    //FIN QUI HO SOLAMENTE APERTO I DUE FILE



    while(fgets(buffer,100,fp1)!=NULL){
        sscanf(buffer,"%d",&anno); //LA SSCANF ESTRAE L'ANNO DALLA STRINGA
 
        if(anno!=1998){
            fputs(buffer,fp2);
        }
    }


    //CHIUDO I FILE
    fclose(fp1);
    fclose(fp2);


    return 0;
}


4 Risposte

  • Re: Problema con sscanf

    Questo ti sarà molto utile https://www.tutorialspoint.com/c_standard_library/c_function_sscanf.htm
  • Re: Problema con sscanf

    Qualcosa di più robusto lo puoi implementare seguendo la struttura seguente, magari avendo cura di scrivere una funzione che converta una stringa in unsigned long (perché nel contesto dell'esercizio non ha senso considerare le date A.C.) basandoti su strtoul.
    
    while(NULL != fgets(...))
    {
            ....
    	while(NULL != strtok(...))
    	{
    		....
    	}
    	anno = strtoul(....);
    	if(.......)
    	{
    		/* ERRORE */
    	}
    	/* copia sul secondo file se...*/
    }
    
    Link utili: sscanf è bene lasciarla agli amatori che intendono rimanere tali.
  • Re: Problema con sscanf

    loopunrolling ha scritto:


    Qualcosa di più robusto lo puoi implementare seguendo la struttura seguente, magari avendo cura di scrivere una funzione che converta una stringa in unsigned long (perché nel contesto dell'esercizio non ha senso considerare le date A.C.) basandoti su strtoul.

    sscanf è bene lasciarla agli amatori che intendono rimanere tali.
    Hai ragione,ma sto realizzando un esercizio per l'università e posso utilizzare solo le funzioni viste a lezione e non alre (fputs,putc,get,sprintf e via dicendo).
  • Re: Problema con sscanf

    beginner32 ha scritto:


    Questo ti sarà molto utile https://www.tutorialspoint.com/c_standard_library/c_function_sscanf.htm
    Letto, ma il mio problema è questo.Non so dove si trova la data

    Faccio un esempio per chiarirmi meglio.

    Nel primo file ho scritto nome e cognome e poi la data,(per una questione di semplicità),ma potrebbe
    anche essere cognome data nome oppure data cognome nome e così via.
    Voglio acquisire la data indipendentemente dalla sua posizione nella riga
Devi accedere o registrarti per scrivere nel forum
4 risposte