|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho corretto il problema del puntatore, sperando di averlo azzeccato
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include <string.h> static char* readFile(FILE * in){ /* Copia il file di input in una stringa e la restituisce. */ long pos, size; char c=0; static char *s; if ((pos = ftell (in)) == -1) return NULL; /* errore */ if (fseek (in, 0, SEEK_END) != 0) return NULL; /* errore */ if ((size = ftell (in)) == -1) return NULL; /* errore */ if (fseek (in, pos, SEEK_SET) != 0) return NULL; /* errore */ s=malloc(size); char *temp=s; while(c!=EOF){ c=fgetc(in); *s=c; s++;} return temp;} int main(void){ FILE *f1; static char *s; f1=fopen("prova.txt", "r"); s=readFile(f1); printf("%s\n", s); system("PAUSE");} |
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
up
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ci sono ancora diverse cose che non vanno e/o che comunque si possono migliorare:
a) La gestione degli errori: malloc può fallire (ritorna NULL) e in tal caso non si può certo continuare con la lettura del file. La tua readFile può a sua volta fallire (proprio perché può ritornare NULL) e quindi anche nel main andrebbe testato il puntatore ottenuto. b) Hai usato la parola chiave 'static' per 2 variabili e per la funzione. Spero che tu abbia capito a cosa serve 'static' ... perché per un programmino del genere non serve. c) La lettura sarebbe più efficiente farla con fread() invece di leggere singoli byte per volta. d) C'è un'altra questione di fondo: tu leggi l'intero contenuto del file. Si presuppone che il contenuto sia "testuale" visto che poi vuoi stamparlo con printf. Già ... ma printf si aspetta una stringa terminata dal carattere nullo. E nella tua area di memoria non hai previsto la impostazione di un carattere nullo finale e tantomeno in un file di testo in genere è presente il carattere nullo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
a)purtroppo ancora non posso usare il main, devo scrivere solo questa funzione. Quindi cosa dovrei testare nella funzione?
b)Mi è stato imposto di usare static, non posso fare altrimenti. Fino a ieri non sapevo nemmeno cosa significasse... c)ho provato a inserire fread ma mi da errore? come mai? devo passarle i parametri in modo diverso dalla fgetc? d)quindi dovrei inserirlo io il carattere nullo? ora provo a farlo |
|
|
|
|
|
#25 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
--> http://www.cplusplus.com/reference/c...dio/fread.html Sì ma chiaramente devi anche allocare 1 byte in più, quindi non size ma size+1. Poi visto che malloc non azzera la memoria, lo imposti tu il nullo con s[size] = '\0';
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 14-03-2008 alle 11:53. |
|||
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Quel genio è il professore
il main che ho scritto io non è il vero main del programma, è un main che ho fatto io per testare la funzione diciamo. comq ho aggiustato quelle cosette, tranne la fread che farò tra un po ma mi da sempre errore... Codice HTML:
#include <stdio.h> #include <stdlib.h> #include <string.h> static char* readFile(FILE * in){ /* Copia il file di input in una stringa e la restituisce. */ long pos, size; char c=0; static char *s; if ((pos = ftell (in)) == -1) return NULL; /* errore */ if (fseek (in, 0, SEEK_END) != 0) return NULL; /* errore */ if ((size = ftell (in)) == -1) return NULL; /* errore */ if (fseek (in, pos, SEEK_SET) != 0) return NULL; /* errore */ s=malloc(size+1); s[size] = '\0'; char *temp=s; while(c!=EOF){ c=fgetc(in); *s=c; s++;} return temp;} int main(void){ FILE *f1; static char *s; f1=fopen("prova.txt", "r"); s=readFile(f1); printf("%s\n", s); system("PAUSE");} |
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
up
|
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
up
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:14.




















