Saltare un parametro da memorizzare in C
Buon giorno!
Sto compilando un programma in cui in input vengono forniti 3 parametri. Il primo è un nome di un file, il secondo è una data (nel formato gg/mm/aaaa) ed il terzo è un numero. Il mio programma deve aggiornare alcune statistiche con il numero fornito come terzo parametro solo per i mesi e per gli anni che corrispondono al file. In pratica devo operare un confronto tra mm/aaaa fornito in input ed il mese e l'anno nel file.
Come posso saltare, nell'assegnazione delle variabili, il numero gg?
Grazie mille!
Sto compilando un programma in cui in input vengono forniti 3 parametri. Il primo è un nome di un file, il secondo è una data (nel formato gg/mm/aaaa) ed il terzo è un numero. Il mio programma deve aggiornare alcune statistiche con il numero fornito come terzo parametro solo per i mesi e per gli anni che corrispondono al file. In pratica devo operare un confronto tra mm/aaaa fornito in input ed il mese e l'anno nel file.
Come posso saltare, nell'assegnazione delle variabili, il numero gg?
Grazie mille!
Risposte
I parametri vengono passati al programma dal sistema operativo, per cui la stringa letta sarà sempre nella forma "gg/mm/aaaa". Puoi però utilizzare a questo punto sscanf per leggere questi valori nel modo seguente:
Immagino che tu sappia il significato di %u (legge un intero senza segno). L'asterisco tra il % e il carattere rappresentante il tipo significa invece che è presente qualcosa di quel tipo nella stringa, ma che deve essere ignorato. Inserendo infine qualsiasi carattere diverso dallo spazio e da %, si chiede a sscanf di leggere quel carattere dalla stringa e ignorarlo. Leggi una descrizione più dettagliata nella pagina http://www.cplusplus.com/reference/clib ... io/sscanf/.
sscanf(argv[2], "%*u/%u/%u", &mese, &anno);
Immagino che tu sappia il significato di %u (legge un intero senza segno). L'asterisco tra il % e il carattere rappresentante il tipo significa invece che è presente qualcosa di quel tipo nella stringa, ma che deve essere ignorato. Inserendo infine qualsiasi carattere diverso dallo spazio e da %, si chiede a sscanf di leggere quel carattere dalla stringa e ignorarlo. Leggi una descrizione più dettagliata nella pagina http://www.cplusplus.com/reference/clib ... io/sscanf/.
Ti ringrazio molto! Posso chiederti ancora un aiuto? La compilazione di questo programma richiedeva di "aggiornare" il nuovo file acqua.new sommando al valore di mm presente nel file in input ed ora copiato in acqua.new (che ho denominato per questo mm.new) il valore passato sulla riga di comando (mm.). E' giusto (per ogni riga del file controllata) calcolare un tot.mm e poi aggiornare il contenuto su acqua.new con la funzione strcpy?
Ecco la mia compilazione:
if ((strcmp(mese.new, mese) == 0) && (strcmp(anno.new, anno) == 0))
{
if (sscanf(argv[3], "%d", &mm.new) != 1)
printf (stderr, "errore-inserire i mm di pioggia da aggiornare\n");
tot.mm = mm + mm.new;
strcpy (mm, tot.mm);
}
Grazie mille!
Ecco la mia compilazione:
if ((strcmp(mese.new, mese) == 0) && (strcmp(anno.new, anno) == 0))
{
if (sscanf(argv[3], "%d", &mm.new) != 1)
printf (stderr, "errore-inserire i mm di pioggia da aggiornare\n");
tot.mm = mm + mm.new;
strcpy (mm, tot.mm);
}
Grazie mille!
Ma il programma viene correttamente compilato? Per scrivere qualcosa come "mese.new" in C, mese deve essere un qualche tipo di struttura, ma sembra essere una stringa per come viene utilizzata. Mi mostreresti quindi anche il resto del codice sorgente? Che manuale/dispensa stai usando per studiare il C?
Sì certo... questo è il programma:
#include
#include
#include
#define MAXBC 127
#define MAXLUN 4 /* massima lunghezza stringa anno */
FILE *my_fopen (char *fname, char *mode)
{
FILE *fp;
if ((fp=fopen(fname,mode)) == NULL)
{
fprintf (stderr, "errore - impossibile aprire il file '%s' in modo '%s'\n",
fname, mode);
exit (1);
}
return fp;
}
void my_fclose (FILE *fp, char *fname)
{
if (fclose(fp) != 0)
fprintf (stderr, "avviso - impossibile chiudere il file '%s'; potrebbe essere danneggiato o inutilizzabile\n",
fname);
}
int main (int argc, char *argv[])
{
FILE *acqua; /* nome del file non noto a priori */
FILE *acqua.new;
char new[MAXBC+1]; /* copia nome file in input per creare nuovo file */
char buf[MAXBC+1];
char anno[MAXLUN+1];
char anno.new[MAXLUN+1];
int nriga = 0; /* contatore righe del file */
int righe_copiate = 0; /* contatore righe copiate sul nuovo file */
int mese;
int mm;
int mese.new;
int mm.new;
int tot.mm;
/* controllo i parametri sulla riga di comando */
if (argc != 4)
{
fprintf (stderr, "ERRORE: numero di parametri errato\n");
exit (2);
}
/* apro il file inserito come primo parametro sulla riga di comando */
f_acqua = my_fopen(argv[1], "r");
/* copio il file del nome in input con l'estensione .new */
strcpy (new, "argv[1].new");
while (fgets(buf,MAXBC,acqua) != NULL)
{
nriga++;
if (sscanf(buf, " %s %d %d" anno, &mese, &mm ) != 2)
fprintf (stderr, "errore di formato nel file %s - riga ignorata (%s)\n", argv [1], buf);
else
/* creo dal nulla un nuovo file in scrittura */
f_acqua.new = my_fopen (new, "w")
/* copio il file acqua.txt fornito dalla riga di comando in questo nuovo file */
righe_copiate = 0;
while ((fgets(buf,MAXBC+1,f_acqua) != NULL) && (righe_copiate
{
if (fputs (buf, f_acqua.new) == EOF)
{
fprintf (stderr, "errore - non riesco a scrivere sul file\n");
exit (3);
}
righe copiate++;
}
if (righe_copiate
fprintf (stderr, "avviso: copiate solo %d righe (invece di %d)\n", righe_copiate, nrighe);
/* chiudo i file */
my_fclose (f_acqua, argv[1]);
my_fclose (f_acqua.new, new);
}
/* acquisisco i parametri da tastiera relativi al mese ed all'anno tralasciando il giorno */
if (sscanf(argv[2], "%*d %d %s", &mese.new, anno.new) != 1)
{
printf (stderr, "errore - inserire la data a cui fare riferimento");
exit (4);
}
/* apro il nuovo file e confronto i parametri acquisiti */
f_acqua.new = my_fopen (new, "r")
while (fgets(buf,MAXBC,acqua.new) != NULL)
{
if (sscanf(buf, " %s %d %d" anno, &mese, &mm ) != 2)
fprintf (stderr, "errore di formato nel file %s - riga ignorata (%s)\n");
if ((strcmp(mese.new, mese) == 0) && (strcmp(anno.new, anno) == 0))
{
if (sscanf(argv[3], "%d", &mm.new) != 1)
printf (stderr, "errore-inserire i mm di pioggia da aggiornare\n");
/* aggiorno la stastistica in una cella e copio il contenuto della nuova cella nella cella del file corrispondente */
tot.mm = mm + mm.new;
strcpy (mm, tot.mm);
}
else
fprintf(f_acqua.new, "%s %d %d\n", anno.new, mese.new, mm.new)
}
/* chiudo il file e termino il programma */
my_fclose (f_acqua.new, new);
exit 0;
}
Spero non ci siano troppi errori! Per la programmazione in C sto utilizzando le dispense fornite dal mio docente.
Grazie mille!
#include
#include
#include
#define MAXBC 127
#define MAXLUN 4 /* massima lunghezza stringa anno */
FILE *my_fopen (char *fname, char *mode)
{
FILE *fp;
if ((fp=fopen(fname,mode)) == NULL)
{
fprintf (stderr, "errore - impossibile aprire il file '%s' in modo '%s'\n",
fname, mode);
exit (1);
}
return fp;
}
void my_fclose (FILE *fp, char *fname)
{
if (fclose(fp) != 0)
fprintf (stderr, "avviso - impossibile chiudere il file '%s'; potrebbe essere danneggiato o inutilizzabile\n",
fname);
}
int main (int argc, char *argv[])
{
FILE *acqua; /* nome del file non noto a priori */
FILE *acqua.new;
char new[MAXBC+1]; /* copia nome file in input per creare nuovo file */
char buf[MAXBC+1];
char anno[MAXLUN+1];
char anno.new[MAXLUN+1];
int nriga = 0; /* contatore righe del file */
int righe_copiate = 0; /* contatore righe copiate sul nuovo file */
int mese;
int mm;
int mese.new;
int mm.new;
int tot.mm;
/* controllo i parametri sulla riga di comando */
if (argc != 4)
{
fprintf (stderr, "ERRORE: numero di parametri errato\n");
exit (2);
}
/* apro il file inserito come primo parametro sulla riga di comando */
f_acqua = my_fopen(argv[1], "r");
/* copio il file del nome in input con l'estensione .new */
strcpy (new, "argv[1].new");
while (fgets(buf,MAXBC,acqua) != NULL)
{
nriga++;
if (sscanf(buf, " %s %d %d" anno, &mese, &mm ) != 2)
fprintf (stderr, "errore di formato nel file %s - riga ignorata (%s)\n", argv [1], buf);
else
/* creo dal nulla un nuovo file in scrittura */
f_acqua.new = my_fopen (new, "w")
/* copio il file acqua.txt fornito dalla riga di comando in questo nuovo file */
righe_copiate = 0;
while ((fgets(buf,MAXBC+1,f_acqua) != NULL) && (righe_copiate
if (fputs (buf, f_acqua.new) == EOF)
{
fprintf (stderr, "errore - non riesco a scrivere sul file\n");
exit (3);
}
righe copiate++;
}
if (righe_copiate
/* chiudo i file */
my_fclose (f_acqua, argv[1]);
my_fclose (f_acqua.new, new);
}
/* acquisisco i parametri da tastiera relativi al mese ed all'anno tralasciando il giorno */
if (sscanf(argv[2], "%*d %d %s", &mese.new, anno.new) != 1)
{
printf (stderr, "errore - inserire la data a cui fare riferimento");
exit (4);
}
/* apro il nuovo file e confronto i parametri acquisiti */
f_acqua.new = my_fopen (new, "r")
while (fgets(buf,MAXBC,acqua.new) != NULL)
{
if (sscanf(buf, " %s %d %d" anno, &mese, &mm ) != 2)
fprintf (stderr, "errore di formato nel file %s - riga ignorata (%s)\n");
if ((strcmp(mese.new, mese) == 0) && (strcmp(anno.new, anno) == 0))
{
if (sscanf(argv[3], "%d", &mm.new) != 1)
printf (stderr, "errore-inserire i mm di pioggia da aggiornare\n");
/* aggiorno la stastistica in una cella e copio il contenuto della nuova cella nella cella del file corrispondente */
tot.mm = mm + mm.new;
strcpy (mm, tot.mm);
}
else
fprintf(f_acqua.new, "%s %d %d\n", anno.new, mese.new, mm.new)
}
/* chiudo il file e termino il programma */
my_fclose (f_acqua.new, new);
exit 0;
}
Spero non ci siano troppi errori! Per la programmazione in C sto utilizzando le dispense fornite dal mio docente.
Grazie mille!
Come ti ho accennato nel mio post precedente, il punto non può far parte del nome di una variabile essendo un operatore con uno scopo particolare in C. Per esempio, acqua.new non è un nome valido per una variabile e alla linea. Devi quindi cambiare tutti i nomi delle variabili che hanno un punto nel loro nome. Ad un certo punto nel main si trova:
che suppongo dovesse essere
La riga seguente:
non fa per niente quello che pensi tu. Copia in new la stringa "argv[1].new". Esattamente questa. "argv[1]" non viene sostituito con il valore che ha tale espressione in C. E ci sono poi tantissimi altri errori simili che è facile trovare provando a compilare il programma e vedendo quali errori vengono segnalati.
f_acqua = my_fopen(argv[1], "r");
che suppongo dovesse essere
acqua = my_fopen(argv[1], "r");
La riga seguente:
strcpy (new, "argv[1].new");
non fa per niente quello che pensi tu. Copia in new la stringa "argv[1].new". Esattamente questa. "argv[1]" non viene sostituito con il valore che ha tale espressione in C. E ci sono poi tantissimi altri errori simili che è facile trovare provando a compilare il programma e vedendo quali errori vengono segnalati.
Quindi, come mi avevi suggerito in un precedente post, piuttosto che strcpy utilizzo strcat? Così posso concatenare ad argv[1] la stringa new?