Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buonasera a tutti.
Sto creando un programmino in C che cifra un qualsiasi file (aprendolo in binario fread,fwrite) passato da riga di comando.
Il programma: nel main si preoccupa di creare una stringa dinamica e, passandola a una funziona chiama apriFile verrà compilata(a blocchi di 255 byte) facendo trovare nella stringa passata dal chiamante il possibile file sempre in binario. Dopo di che verrà sottoposta a algoritmi di cifratura, ma il problema sta proprio in questa prima funzione.Ecco il codice:
Codice sorgente - presumibilmente C++
void apriFile(char*nomeFile, char**s, int*dim){//s= stringa da cod/decod, *dim dimensioni della stringa da cod/decod
dopo veramente tantissime prove e cambio di istruzioni, sono arrivato a capire che il problema è dato da uno '/0' posto a fine stringa che mi fa crashare il programma quando eseguo la realloc nella funzione..
Il compilatore dice che c'è un problema di SIGTRAP
Vi ringrazio in anticipo
Ultima modifica effettuata da mark22 il 30/10/2017 alle 11:03
Ho dato una letta molto veloce ma mi sembra che non tieni conto del terminatore quando incrementi *dim di count, forse dovrebbe essere *dim += count+1;
Per completezza puoi mettere anche il codice di inizializzaStringa?
P.S. Non è il compilatore che dà SIGTRAP, ma il sistema operativo quando esegue il tuo programma.
Ultima modifica effettuata da lumo il 29/10/2017 alle 22:48
Ma se lavori con file in binario perché usi stringhe e funzioni stringa?
Si usano dei buffer senza terminazione dato che puoi leggere anche byte a zero dal file, infatti usi la fread !
Quindi niente strcpy, strcat ... e simili.
E non usare feof in quel modo, anzi, non usarlo proprio ... è un errore comune tra i principianti
Ultima modifica effettuata da nessuno il 30/10/2017 alle 9:15
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Ho dato una letta molto veloce ma mi sembra che non tieni conto del terminatore quando incrementi *dim di count, forse dovrebbe essere *dim += count+1;
Per completezza puoi mettere anche il codice di inizializzaStringa?
P.S. Non è il compilatore che dà SIGTRAP, ma il sistema operativo quando esegue il tuo programma.
Correggendo questo il programma funziona correttamente.. grazie
Codice sorgente - presumibilmente C/C++
void inizializzaStringa(char *s,int dim){
int i;
for(i=0;i<dim;i++)
*(s+i)='\0';
}
Mikelius la funzione codifica non crea nessun problema per adesso, grazie per avermi fatto notare la free(stringone) che porta a un crash se non venisse eseguito il primo if.
Testo quotato
Postato originariamente da nessuno: Ma se lavori con file in binario perché usi stringhe e funzioni stringa?
Si usano dei buffer senza terminazione dato che puoi leggere anche byte a zero dal file, infatti usi la fread !
Quindi niente strcpy, strcat ... e simili.
E non usare feof in quel modo, anzi, non usarlo proprio ... è un errore comune tra i principianti
Si giusto mi era sfuggito questo particolare.. ho corretto il codice utilizzando fseek e ftell al posto di feof e risulta molto più veloce che leggere il file a blocchi. Ecco il codice:
Codice sorgente - presumibilmente C++
void apriFile(char*nomeFile,unsignedchar** s, int*dim){//s= stringa da cod/decod
hai cambiato tutto il codice...
Se non usi più i blocchhi di 255 byte, perchè usi la realloc su aus?
Ti consiglio di elaborare il file con aus (anche fread), poi se tutto è ok, associare aus ad *s.
Non ti scordare il free(aus), aus dopo che non serve va deallocata.
Attento ad
Codice sorgente - presumibilmente C/C++
if(f==NULL)
printf("\nErrore nell'apertura del file.");
Non sarebbe meglio un
Codice sorgente - presumibilmente C/C++
if(f==NULL){
printf("\nErrore nell'apertura del file.");
return;
}
una curiosità, che compilatore usi?
potresti usare la funzione stat() che, dato il nome di un file, restituisce una struttura che tra gli elementi ha pure la dimensione del file, invece che fseek e ftell, se lo scopo è solo determinare la dimensione in byte (su questo punto però aspetta conferma da altri)
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).
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
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?