Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Usare fwrite per un vettore di caratteri
Forum - C/C++ - Usare fwrite per un vettore di caratteri

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 8:56
Venerdì, 26/06/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...

Testo quotato


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
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 11:11
Venerdì, 26/06/2009
Testo quotato

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...

Testo quotato


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. :k:

Luigi

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 11:53
Venerdì, 26/06/2009

Ecco un veloce esempio, guardate cosa appare nel file.bin :)
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. #define DIM 100
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9.  char *stringa[DIM];
  10.  FILE *fp;
  11.  
  12.  stringa[0] = "ciao";
  13.  
  14.  fp = fopen("prova.bin", "wb");
  15.  
  16.  fwrite(stringa[0], sizeof(stringa), 1, fp);
  17.  
  18.  printf("%s\n", stringa[0]);
  19.  
  20.  fclose(fp);
  21.  
  22.  
  23.  system("pause");
  24.  return 0;  
  25.  
  26. }


Ultima modifica effettuata da Lawliet il 26/06/2009 alle 11:56
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:11
Venerdì, 26/06/2009
Testo quotato

Postato originariamente da Lawliet:


Ecco un veloce esempio, guardate cosa appare nel file.bin :)
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. #define DIM 100
  4.  
  5.  
  6.  
  7. int main()
  8. {
  9.  char *stringa[DIM];
  10.  FILE *fp;
  11.  
  12.  stringa[0] = "ciao";
  13.  
  14.  fp = fopen("prova.bin", "wb");
  15.  
  16.  fwrite(stringa[0], sizeof(stringa), 1, fp);
  17.  
  18.  printf("%s\n", stringa[0]);
  19.  
  20.  fclose(fp);
  21.  
  22.  
  23.  system("pause");
  24.  return 0;  
  25.  
  26. }




Scusa ma questo e' il sorgente, cosa appare nel file prova.bin

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 12:17
Venerdì, 26/06/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è.

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:23
Venerdì, 26/06/2009
Testo quotato

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. :k:

Luigi

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 12:38
Venerdì, 26/06/2009
Eh si, anche io avevo un dubbio riguardo a questo... però anche facendo come dici te, il risultato non cambia :(

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:06
Venerdì, 26/06/2009
Codice sorgente - presumibilmente Plain Text

  1. 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

  1. fwrite(stringa[0], strlen(stringa[0]), 1, fp);




:k:

Ultima modifica effettuata da il 26/06/2009 alle 15:09
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 19:22
Venerdì, 26/06/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
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo