Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Salve a tutti, ho il seguente problema:
ho dichiarato un vettore di stringhe senza dichiarare la dimensione di stringa:
char *stringhe[DIM]
perchè quando vado poi a fare la scrittura su file in modalità binaria, non mi salva correttamente? O salva simboli strani...
for(i = 0; i < n_elementi; i++)
fwrite(&stringhe, sizeof(stringhe), 1, fp);
|
Mentre dichiarandola così:
typedef char String[SIZE];
String stringhe[DIM];
Mi scrive correttamente!?!?
Non riesco a trovare la soluzione per questo
Ho pensato che magari bisogna prima allocare, e poi scrivere.. e neanche quello funziona :S
Non so più che fare Ultima modifica effettuata da Lawliet il 26/06/2009 alle 8:57 |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da Lawliet:
Salve a tutti, ho il seguente problema:
ho dichiarato un vettore di stringhe senza dichiarare la dimensione di stringa:
char *stringhe[DIM]
perchè quando vado poi a fare la scrittura su file in modalità binaria, non mi salva correttamente? O salva simboli strani...
for(i = 0; i < n_elementi; i++)
fwrite(&stringhe, sizeof(stringhe), 1, fp);
|
Mentre dichiarandola così:
typedef char String[SIZE];
String stringhe[DIM];
Mi scrive correttamente!?!?
Non riesco a trovare la soluzione per questo
Ho pensato che magari bisogna prima allocare, e poi scrivere.. e neanche quello funziona :S
Non so più che fare |
Non vorrei sbagliarmi ma se lo dichiari nel primo modo il compilatore prende quel vettore di caratteri come una stringa, per cui penso che la fwrite pretenda di trovare il carattere '\0' altrimenti continua a scrivere tutto quello che trova (da qui' i simboli strani).
Ciao.
Luigi |
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Ecco un veloce esempio, guardate cosa appare nel file.bin
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #define DIM 100 int main() { char *stringa[DIM]; FILE *fp; stringa[0] = "ciao"; fp = fopen("prova.bin", "wb"); fwrite(stringa[0], sizeof(stringa), 1, fp); printf("%s\n", stringa[0]); fclose(fp); system("pause"); return 0; }
|
Ultima modifica effettuata da Lawliet il 26/06/2009 alle 11:56 |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da Lawliet:
Ecco un veloce esempio, guardate cosa appare nel file.bin
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #define DIM 100 int main() { char *stringa[DIM]; FILE *fp; stringa[0] = "ciao"; fp = fopen("prova.bin", "wb"); fwrite(stringa[0], sizeof(stringa), 1, fp); printf("%s\n", stringa[0]); fclose(fp); system("pause"); return 0; }
|
|
Scusa ma questo e' il sorgente, cosa appare nel file prova.bin |
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
giustamente hai ragione.
ecco:
"ciao wb prova.bin %s
pause -LIBGCCW32-EH-2-SJLJ-GTHR-MINGW32 w32_sharedptr->size == sizeof(W32_EH_SHARED) %s:%u: failed assertion `%s'
../../gcc/gcc/config/i386/w32-shared-ptr.c GetAtomNameA (atom, s, sizeof(s)) != 0 "
mmmmmmmmmmmmm.... non so proprio il perchè.
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da Lawliet:
giustamente hai ragione.
ecco:
"ciao wb prova.bin %s
pause -LIBGCCW32-EH-2-SJLJ-GTHR-MINGW32 w32_sharedptr->size == sizeof(W32_EH_SHARED) %s:%u: failed assertion `%s'
../../gcc/gcc/config/i386/w32-shared-ptr.c GetAtomNameA (atom, s, sizeof(s)) != 0 "
mmmmmmmmmmmmm.... non so proprio il perchè. |
Vedi? Forse e' come dicevo io, parte da "ciao" pero' poi continua finche' non trova il carattere terminatore.
Prova a fare una prova scrivendo "ciao\0" e vedi che succede.
Ciao.
Luigi |
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
Eh si, anche io avevo un dubbio riguardo a questo... però anche facendo come dici te, il risultato non cambia
|
|
()
Newbie
Messaggi:
Iscritto:
|
Codice sorgente - presumibilmente Plain Text |
fwrite(stringa[0], sizeof(stringa), 1, fp);
|
errore!
fwrite si aspetta il numero di bytes da scrivere. Dal momento che la tua variabile "stringa" è stata dichiarata come char *stringa[100], quello che effettivamente rappresenta è un vettore di 100 elementi, ciascuno di tipo char *.
In una macchina a 32 bit, un char * occupa 4 bytes, pertanto la dimensione totale dell'array è di 4 * 100 = 400 bytes.
La funzione fwrite pertanto sta scrivendo 400 bytes di dati.
Ho analizzato anche il file in output che hai postato, e contiene 243 bytes di dati. Probabilmente il 244-esimo byte in output era un carattere di EOF, il quale ha fatto terminare l'output. La "spazzatura" che vedi in output non è altro che un dump della memoria, a partire dall'indirizzo in cui è memorizzata la stringa "ciao", che si estende per 243 bytes, e dato che questa regione di memoria contiene le stringhe e i simboli di debug dell'eseguibile, ecco che ritrovi anche la stringa "wb" e la stringa "prova.bin".
Da notare come le due stringhe siano in ordine inverso rispetto all'ordine in cui compaiono nel codice. Questo è dovuto al fatto che il compilatore valuta i parametri delle funzioni (e quindi memorizza i valori costanti che vi incontra) in ordine inverso, dall'ultimo fino al primo.
correggi il tuo codice in questo modo:
Codice sorgente - presumibilmente Plain Text |
fwrite(stringa[0], strlen(stringa[0]), 1, fp);
|
Ultima modifica effettuata da il 26/06/2009 alle 15:09 |
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
E scusa come faccio poi a leggere? Mica posso usare strlen! :S
edit: azz, si è cancellato addiritura o.O'
Ultima modifica effettuata da Lawliet il 26/06/2009 alle 19:26 |
|