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 - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 12:17
Martedì, 30/06/2009
Sì ... facci vedere cosa avevi scritto per allocare le stringhe con la malloc.

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 17:02
Martedì, 30/06/2009
Eccomi, scusa se mi sono assentato:

Avevo fatto così (ho appena "migliorato"):

Codice sorgente - presumibilmente C/C++

  1. char *str;
  2. str = malloc( sizeof(char *));
  3.  
  4. str = stringa[0];
  5.  
  6. fwrite(str, sizeof(char *), 1, fp);



stranamente mi funziona però con un difetto che mettendo "ciao" mi appare "ciao-" perchè?

Codice sorgente - presumibilmente C/C++

  1. char *str;
  2. str = malloc( sizeof(char *));
  3.  
  4. fread(str, sizeof(char *), 1, fp);
  5.  
  6. stringa[0] = str;



EDIT: anche scrivendo "balblablalba" mi spezza e mi dà una parte della stringa inserita sempre con il trattino finale.
Devo aver capito male come usare la malloc.

Ultima modifica effettuata da Lawliet il 30/06/2009 alle 17:04
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:48
Martedì, 30/06/2009
Testo quotato

Devo aver capito male come usare la malloc.



Sì, il motivo e' proprio questo.

La malloc alloca byte di memoria e assegna l'indirizzo al puntatore.

Quindi, quando scrivi

Codice sorgente - presumibilmente C/C++

  1. char *str;
  2. str = malloc( sizeof(char *));



stai allocando solamente 4 byte per la tua stringa perche' la sizeof che hai scritto restituisce proprio 4. Se vuoi prevedere un certo numero di caratteri (diciamo 50 + 1 per il terminatore) devi scrivere

Codice sorgente - presumibilmente C/C++

  1. char *str;
  2. str = (char *)malloc(51 * sizeof(char));



e nota bene che la sizeof deve prevedere il tipo char e non il tipo char *

Per scrivere su file la stringa, dopo averla letta da tastiera, dovrai scrivere in modo analogo

Codice sorgente - presumibilmente Plain Text

  1. fwrite(str, 51 * sizeof(char), 1, fp);



e per leggere

Codice sorgente - presumibilmente Plain Text

  1. fread(str, 51 * sizeof(char), 1, fp);




PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 18:00
Martedì, 30/06/2009
Corretto, funziona tutto! Grazie, però ora il dubbio è che se metto però una stringa lunga 100 caratteri come faccio? Potevo usare la strlen però poi a leggere, viene sballato.. :S
Devo sempre dare una dimensione "massima" come punto di riferimento?

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:12
Martedì, 30/06/2009
Devi dare una dimensione massima ... ecco perche' ti parlavo di 8 k per il buffer ...

Per l'input usa la fgets e non la gets perche' cosi' puoi indicare la dimensione massima del buffer e non incorrerai in buffer overflow.

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 19:30
Martedì, 30/06/2009
Uff, odio dare una dimensione massima.. preferisco che la dimensione la si acquisisce mentre va in corso il programma :-o
Ok grazie di tutto ancora.

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:36
Martedì, 30/06/2009
E' un modo comodo e pratico ... se vuoi proprio complicarti la vita devi

1) impostare un ciclo in cui prelevi un carattere alla volta

2) inserisci i caratteri pressati fino al RETURN in un buffer che hai allocato all'inizio con 1 byte

3) utilizzi la funzione realloc() per modificare la dimensione del buffer allocato in precedenza

4) alla fine, deallochi il buffer con la free

e considera che non esistono funzioni standard per realizzare il punto 1) ma ti dovrai affidare ad API specifiche del sistema operativo.

Insomma ... non ne vale la pena ...

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 19:43
Martedì, 30/06/2009
Ok. come non detto! Grazie ancora! ^^

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo