|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2007
Messaggi: 153
|
[c]errore di i/o in ritorno da funzione
Il seguente codice mi va in segmentation fault al momento del ritorno dalla finzione "createf" richiamata nel main.
Ho fatto il debugger con DDD e mi pare che vada bene tranne che quando dovrebbe ritornare 0 e invecie va in seg fault. Qualcuno può aiutarmi? 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 lung; char str[1]; char* stringa; char* sval; float fval; struct tm * t; time_t tx; if ((file=fopen(path, mode))==NULL) { printf("errore1"); } fprintf(filesave,"%s,",path); va_start(ap,fmt); while(*fmt!='\0') { if(isalpha(*fmt)!=0) { lung=strcspn(fmt," "); stringa=strncpy(str,fmt,lung); if(fputs(stringa,filesave)==EOF) //scrive il nome del metadato { printf("errore2");//gestione errore in fputs } 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*); fprintf(filesave,"%s,",sval); fmt++; break; case 'n': fval=va_arg(ap,double); fprintf(filesave,"%f,",fval); 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 } fprintf(filesave,"%d/%d/%d,",t->tm_mday,t->tm_mon+1,t->tm_year+1900); 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 } } } fprintf(filesave,"\n"); 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; 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"); FILE* fil=fopen("save.sav","r"); while((car=fgetc(fil))!=EOF) { if(car=='\0') printf("errore"); } printf("tuttook"); fclose(fil); return 1; } L'errore che DDD mi da è: Error accessing memory address 0x86f6972: Input/output error |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:06.