codice:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h> //per la gestione del time
#include <stdio.h>
int createf(const char *path,const char *mode,char* fmt,...) //funzione con numero di parametri variabile, i primi 2 servono per la fopen, il terzo è una stringa di formato per i parametri variabili. E'un errore nn passare la stringa di formato, al limite passarla vuota per non inserire metadati. Eventuali parametri in più rispetto a quelli specificati nella stringa di formato vengono ignorati.
{
va_list ap; //il puntatore a argomento
FILE* file; //il file da creare o modificare
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
int close;
int lung;
char* stringa;
char* sval;
float fval;
struct tm * t;
time_t tx;
int scritti;
if ((file=fopen(path, mode))==NULL)
{
printf("errore1");
}
scritti=fprintf(filesave,"%s,",path);
if (scritti<0)
{
printf("errore 10");//trattamento errore
}
va_start(ap,fmt);
while(*fmt!='\0')
{
if(isalpha(*fmt)!=0)
{
lung=strcspn(fmt," ");
char *str=malloc(sizeof(char)*lung+1);
stringa=strncpy(str,fmt,lung);
stringa[lung]='\0';
if(fputs(stringa,filesave)==EOF) //scrive il nome del metadato
{
printf("errore2");//gestione errore in fputs
}
fputc(',',filesave);
fmt=fmt+lung; //fmt punta al successivo formato di tipo metadato(%s,%n..)
if(isspace(*fmt)==0)
{
printf("errore3");//trattamento errore, non c'è lo spazio dopo il nome di metadato
}
fmt++;
if(*fmt=='%')
{
fmt++;
switch(*fmt)
{
case 's':
sval=va_arg(ap,char*);
scritti=fprintf(filesave,"%s,",sval);
if (scritti<0)
{
printf("errore 11");
}
fmt++;
break;
case 'n':
fval=va_arg(ap,double);
scritti=fprintf(filesave,"%f,",fval);
if (scritti<0)
{
printf("errore 12");
}
fmt++;
break;
case 'd':
t=va_arg(ap,struct tm*);
tx=mktime(t);
if (tx == (time_t) (-1))
{
printf ("Errore! %ld\n", (long int) tx); //trattamento errore data da rivedere
}
scritti=fprintf(filesave,"%d/%d/%d,",t->tm_mday,t->tm_mon+1,t->tm_year+1900);
if (scritti<0)
{
printf("errore 14");
}
fmt++;
break;
default :
printf("errore4");//trattamento errore formato sconosciuto
break;
}
}
else
{
printf("errore5");//gestione errore, non c'è % dopo il nome del metadato e lo spazio
}
}
}
scritti=fprintf(filesave,"\n");
if (scritti<0)
{
printf("errore15");
}
close=fclose(filesave);
if (close==EOF)
{
//trattamento errore
}
va_end(ap);
return 0;
}
int createfwm(const char *path,const char *mode)
{
FILE* file;
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
if ((file=(fopen(path, mode)))==((FILE*)NULL))
{
return EOF; //gestione errore
}
fprintf(filesave,"%s\n",path);
if(fclose(filesave)==EOF)
{
return EOF; //gestione errore
}
return 1;
}
int main()
{
printf("tuttook0\n");
struct tm* tempo=malloc(sizeof(struct tm));
tempo->tm_year=150;
tempo->tm_mday=15;
tempo->tm_mon=5;
char car;
int a=createfwm("prova.pro","w");
int b=createfwm("provi.pri","w");
int c=createfwm("prove.pre","w");
printf("tuttook1");
int d=createf("provu.pru","w","proprietario %srevisione %ndata %d","paolo",5,tempo);
printf("tuttook2");
return 1;
}