ktux (Normal User)
Newbie
Messaggi: 6
Iscritto: 25/08/2010
|
Salve a tutti,
sono nuovo del forum e come prima cosa...complimenti!
Sto facendo un programma in c per testare delle password e, essendo un'operazione molto lunga, volevo creare un file contenente solamente una password ogni n tentativi, in modo da poter interrompere l'elaborazione e riprenderla usando tale file come "check point".
Il main al momento contiene:
FILE *fp;
int contatore = 0;
int i;
for(i = 0; i < nmax; i++)
{
.
.
.
//generazione password iesima
contatore++;
if(contatore == n)
{
remove("log.txt");
fp = fopen("log.txt", "w");
fprintf(fp, "%s", password);
close(fp);
contatore = 0;
}
}
la generazione funziona, ma al momento della "sovrascrittura" del file incappo in un errore di segmentation fault.
Qualcuno può darmi qualche dritta? Grazie in anticipo a chi risponderà!
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Ciao!
Ho letto il programma, e non posso dirti esattamente quale sia il problema; (posta il programma comloeto).
Probabilmente, utilizzi la fariabile fp in letture e scrittura in contemporanea.
Il comando " remove("log.txt"); " risulta inutile.
Basta aprire un file in scrittura per cancellare il suo contenuto.
|
|
Matthew (Member)
Expert
Messaggi: 387
Iscritto: 29/01/2007
|
Controlla sempre il valore di ritorno della funzione fopen prima di utilizzarne il puntatore associato.
Prova anche a postare il programma completo.
|
|
ktux (Normal User)
Newbie
Messaggi: 6
Iscritto: 25/08/2010
|
il programma completo è abbastanza lungo, in pratica si tratta della generazione di password alfanumeriche del tipo
aaaa
aaac
aaad
aaae
....
aab0
e così via. Anche rogliendo il remove ottengo lo stesso errore segmentation fault....temo che il problema sia nell'utilizzo del puntatore
|
|
Matthew (Member)
Expert
Messaggi: 387
Iscritto: 29/01/2007
|
L'errore è alla riga 54.
Se non ci mandi il codice non ti possiamo aiutare.
|
|
ktux (Normal User)
Newbie
Messaggi: 6
Iscritto: 25/08/2010
|
ok, implementerò quella funzione in un listato ridotto e ve lo posterò al più presto!
|
|
ktux (Normal User)
Newbie
Messaggi: 6
Iscritto: 25/08/2010
|
Rieccomi!
Ecco un listato pronto per essere compilato:
#include <stdio.h>
int main()
{
FILE *fp;
int contatore = 0;
int i;
int ripetizioni = 0;
int end = 15;
//Int end = 12000;
for(i = 0; i<end; i++)
{
printf("%i\n", i);
contatore++;
if(contatore == 2)
{
ripetizioni++;
fp = fopen("log.txt", "w");
fprintf(fp, "%i", ripetizioni);
close(fp);
contatore = 0;
}
}
printf("\n\n%i\n", ripetizioni);
return(0);
}
decommentando la riga 10 si incappa nell'errore segmentation fault, mentre lasciando il commento il file log.txt conterrà solo il valore 1 quando dovrebbe visuualizzare il numero 7...(visibile nell'ultima riga dell'output). Qualche idea?
|
|
jack92 (Member)
Pro
Messaggi: 100
Iscritto: 06/08/2010
|
Postato originariamente da ktux:
Rieccomi!
Ecco un listato pronto per essere compilato:
#include <stdio.h>
int main()
{
FILE *fp;
int contatore = 0;
int i;
int ripetizioni = 0;
int end = 15;
//Int end = 12000;
for(i = 0; i<end; i++)
{
printf("%i\n", i);
contatore++;
if(contatore == 2)
{
ripetizioni++;
fp = fopen("log.txt", "w");
fprintf(fp, "%i", ripetizioni);
close(fp);
contatore = 0;
}
}
printf("\n\n%i\n", ripetizioni);
return(0);
}
decommentando la riga 10 si incappa nell'errore segmentation fault, mentre lasciando il commento il file log.txt conterrà solo il valore 1 quando dovrebbe visuualizzare il numero 7...(visibile nell'ultima riga dell'output). Qualche idea? |
Il codice che hai scritto funziona bene . Nel file "log.txt" trovo 7, e se decommento la riga 10 , nel file ottengo 6000 (Ho usato dev-c++ per compilare il codice ) non so da che può dipendere |
|
Matthew (Member)
Expert
Messaggi: 387
Iscritto: 29/01/2007
|
Ho trovato l'errore. Scusa, mi era sfuggito la prima volta che ho guardato il tuo codice.
Tu per chiudere il file chiami la funzione close(). Non va bene. Devi usare fclose().
close() opera sui file descriptor.
fclose() opera sugli stream (che è il tuo caso)
fclose() chiama a sua volta close(), ma opera ad un livello un po' più alto.
Come hai potuto vedere, non sono intercambiabili.
Per maggiori informazioni:
http://www.gnu.org/software/hello/manual/libc/Streams-and- ...
|
|