Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema scrittura ciclica file txt
Forum - C/C++ - Problema scrittura ciclica file txt

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
ktux (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 14:24
Mercoledì, 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à!:)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 951
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:42
Mercoledì, 25/08/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.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 14:44
Mercoledì, 25/08/2010
Controlla sempre il valore di ritorno della funzione fopen prima di utilizzarne il puntatore associato.
Prova anche a postare il programma completo.


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
ktux (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 14:53
Mercoledì, 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 :(

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 14:55
Mercoledì, 25/08/2010
L'errore è alla riga 54.

:rotfl::rotfl:

Se non ci mandi il codice non ti possiamo aiutare.


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
ktux (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 14:57
Mercoledì, 25/08/2010
ok, implementerò quella funzione in un listato ridotto e ve lo posterò al più presto! :k:

PM Quote
Avatar
ktux (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 18:31
Mercoledì, 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? :(

PM Quote
Avatar
jack92 (Member)
Pro


Messaggi: 100
Iscritto: 06/08/2010

Segnala al moderatore
Postato alle 19:05
Mercoledì, 25/08/2010
Testo quotato

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 :(


"Il sapere umano appartiene al mondo"
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 19:43
Mercoledì, 25/08/2010
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- ...


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo