Dovreste aiutarmi a rendere stabile la funzione get_string,funziona bene sulle letture da stdio,ma da file da problemi.
Molte volte mi stampa anche un' altra stringa,probabilmente è perchè l' area di memoria di ptr si è espansa e contiene qualche valore casuale,essendo che mi devo fermare a i e non i+1,però non mi include mai il terminatore alla fine,glelo devo dire 2 volte sennò non me lo considera
Ecco qua cosa sto provando a fare,lettura da file,sostituite quel "prova.txt" con qualsiasi altro file.
Sto provando ad aprire il file prova.txt che contiene:
codice:
5
78
89
90
hhhhhh
ghhhhhh
5
30
12
30
hhhhhhhhhh
fhfhhfhf
Ecco il codice completo:
codice:
typedef struct
{
int data [4]; /* contenuto: mese,giorno,ora,minuti */
char *oggetto;
char *testo;
}nota;
typedef struct
{
int par[2]; /* parametri di ricerca di una nota */
char *parole_chiave;
}parametri;
void nota_write (FILE *fp,nota *ptr);
nota *nota_read(FILE*fp,nota *ptr);
int num_line(FILE*fp);
char* get_string(FILE *fp,char*ptr);
int main()
{
nota *ptr;
FILE *fp;
fp=fopen("prova.txt","r");
ptr=nota_read(fp,ptr);
fclose(fp);
return 0;
}
nota *nota_read(FILE*fp,nota *ptr)
{
ptr=(nota*)malloc(sizeof(nota));
fscanf(fp,"%d\n%d\n%d\n%d\n",&(*ptr).data[0],&(*ptr).data[1],&(*ptr).data[2],&(*ptr).data[3]);
(*ptr).oggetto=get_string(fp,(*ptr).oggetto);
(*ptr).testo=get_string(fp,(*ptr).testo);
return ptr;
}
void nota_write (FILE *fp,nota *ptr)
{
fprintf(fp,"%d\n%d\n%d\n%d\n%s\n%s\n",(*ptr).data[0],(*ptr).data[1],(*ptr).data[2],(*ptr).data[3],(*ptr).oggetto,(*ptr).testo);
}
int num_line(FILE*fp)
{
int c,line=1;
do
{
c = fgetc (fp);
if (c == '\n')
line++;
}while (c != EOF);
rewind(fp);
return line;
}
char* get_string(FILE *fp,char*ptr)
{
ptr=(char*)malloc(sizeof(char));
int i=1;
char ci;
fflush(stdin);
while(ci!=10)
{
ci=fgetc(fp);
ptr[i-1]=ci;
ptr=(char*)realloc(ptr,i*sizeof(char));
i++;
}
ptr[i-2]='\0';
puts(ptr);
printf("%d",strlen(ptr));
fflush(stdin);
return ptr;
}
La get_string funziona male,provate a sostituire,quel puts alla fine della get_string dovrebbe stampare la stringa letta da file,ma mi stampa:
Anche se il terminatore glielo ho messo e stramesso (ho anche provato a inserirlo 2 volte).
Ma niente da fare,ogni volta mi stampa una stringa sporca