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++ - Problema con stringa dinamica!
Forum - C/C++ - Problema con stringa dinamica! - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:55
Lunedì, 30/10/2017
Testo quotato

Postato originariamente da Mikelius:

Testo quotato

Postato originariamente da lumo:

Così è di sicuro sbagliata, perché se il file contiene 10 caratteri, tu allocherai una stringa di 10 char, ma te ne servono 11 per avere anche il terminatore finale.
Usare realloc in questo caso non ha senso, fa direttamente una singola allocazione con malloc o calloc una volta che hai ottenuto la dimensione del file (vantaggio scontato: un punto solo in cui malloc può fallire invece di due, uno sul primo calloc e l'altro su realloc).



non solo, ma eseguendo la realloc/calloc/malloc con :

Codice sorgente - presumibilmente Plain Text

  1. sizeof(unsigned char*)



non si sta allocando uno spazio 4 volte maggiore rispetto al necessario?
quindi non "si nota" il +1 a dim mancante, perche in realta la dimensione allocata è 4x(*dim) e non (*dim)
o sbaglio? i puntatori sono gestiti da 4 byte per indirizzo a prenscindere dal tipo, giusto?



Hai proprio ragione, il codice corretto dovrebbe avere sizeof(char).
4 byte per indirizzo invece non è detto. Di fatto mi pare di ricordare che l'unica dimensione che lo standard garantisce è sizeof(char) == 1, ma le dimensioni dei puntatori possono essere differenti. Nella pratica, le architetture più comuni a 32 bit hanno puntatori di 4 byte, mentre quelle a 64bit hanno puntatori di 8 byte.

Mark22 c'è un motivo per cui usi unsigned char? Vuoi leggere un file binario?

Ultima modifica effettuata da lumo il 30/10/2017 alle 18:57
PM Quote
Avatar
mark22 (Normal User)
Newbie


Messaggi: 11
Iscritto: 29/10/2017

Segnala al moderatore
Postato alle 19:10
Lunedì, 30/10/2017
Vi ringrazio per l'ennesima volta.. si voglio poter leggere qualsiasi tipo di file.
Ma se utilizzassi array di unsigned int sarebbe ancora meglio giusto? Così evito la gestione del carattere terminatore

Ultima modifica effettuata da mark22 il 30/10/2017 alle 19:15
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 19:40
Lunedì, 30/10/2017
Se vuoi leggere un file binario, ritorna ad aprire il file con "rb".
Salva il contenuto in un array (dinamico) di unsigned char (io preferisco usare uint8_t che si trova in <stdint.h>, in questi casi).
Il terminatore non serve visto che non si tratta di una stringa, però devi salvarti la lunghezza di ciò che hai letto da qualche parte.
Unsigned int non va bene qui.

PM Quote
Avatar
mark22 (Normal User)
Newbie


Messaggi: 11
Iscritto: 29/10/2017

Segnala al moderatore
Postato alle 20:11
Lunedì, 30/10/2017
Testo quotato

Postato originariamente da lumo:

Se vuoi leggere un file binario, ritorna ad aprire il file con "rb".
Salva il contenuto in un array (dinamico) di unsigned char (io preferisco usare uint8_t che si trova in <stdint.h>, in questi casi).
Il terminatore non serve visto che non si tratta di una stringa, però devi salvarti la lunghezza di ciò che hai letto da qualche parte.
Unsigned int non va bene qui.


Potrei chiederti che differenza c'è tra unsigned char e uint8_t?? Non l'ho mai utilizzato il secondo.
Così va bene giusto?
Codice sorgente - presumibilmente C++

  1. void apriFile(char *nomeFile,unsigned char** s, int *dim){
  2.         FILE *f;
  3.         f=fopen(nomeFile,"rb");
  4.         if(f==NULL){
  5.                 printf("\nErrore nell'apertura del file.");
  6.                 return;
  7.         }
  8.         if(*s!=NULL)
  9.                 free(*s);
  10.         fseek(f, 0, SEEK_END);
  11.         *dim=ftell(f);
  12.         rewind(f);
  13.         *s=(unsigned char*)malloc(*dim*sizeof(char));
  14.          if(*s==NULL){
  15.            printf("ERRORE!");
  16.            return;
  17.          }
  18.         else
  19.               fread(*s,sizeof(char),*dim,f);       
  20.         fclose(f);
  21. }


Ultima modifica effettuata da mark22 il 30/10/2017 alle 20:13
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 20:35
Lunedì, 30/10/2017
Se l'allocazione fallisce non raggiungerai fclose, questo va corretto.
Poi se si volesse essere proprio precisi bisognerebbe anche controllare che fread() abbia letto :pat:

PM Quote
Avatar
mark22 (Normal User)
Newbie


Messaggi: 11
Iscritto: 29/10/2017

Segnala al moderatore
Postato alle 20:47
Lunedì, 30/10/2017
Ok perfetto per la fclose.. per la fwrite non dovrebbe esserci problema perchè quando determina la dimensione del file, in caso fosse 0, la malloc fallirebbe. Grazie davvero dei consigli mi siete stati davvero d'aiuto :) :)

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 21:04
Lunedì, 30/10/2017
Testo quotato

Postato originariamente da mark22:

....per la fwrite non dovrebbe esserci problema perchè quando determina la dimensione del file, in caso fosse 0, la malloc fallirebbe. Grazie davvero dei consigli mi siete stati davvero d'aiuto :) :)  



Non essere cosi sicuro delle funzioni, testare il valore di ritorno (che è utile inserire se la funzione potrebbe non essere svolta) è importante anche nelle printf() (ok, ho esagerato per questo programmino).

Prova ad eseguire il programma con diversi file, ad esempio; uno inestistente, uno vuoto, uno pieno ecc ecc. e guarda come si comporta il programma. (p.s. se passi argomenti da linea di comando, è bene testare che ci siano prima di utilizzarli, nel tuo main non ci sono i controlli)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo