Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7

    Problema con rename e remove in c

    Ciao a tutti,

    ho la necessità di fare una funzione in c che preso in input un nome, deve cancellare la riga da un file contente tale parola. La soluzione adottata è quella di usare un file temporaneo.
    Quello che faccio è aprire in lettura il file originario, lo copio riga per riga nell'altro file (tranne ovviamente la riga da cancellare), che precedentemente avevo aperto in scrittura, chiudo entrambi i file, cancello il file originale e rinomino il file temporaneo con il nome del file originario. Tuttavia sebbene il ragionamento sembra funzionare non capisco perchè non mi cancella il file originale e se tento di aprirlo mi esce un alert con scritto "Accesso Negato". Cosa c'è che non va? Per migliore comprensione vi posto anche il codice:




    int disconnetti(char u[]){
    char buffer[MAXLINE],utente[MAXLINE],nome[MAXLINE];
    FILE *f;
    FILE *new;

    f=fopen("connessi.txt","r");
    new=fopen("newconnessi.txt","w");

    if (f==NULL) {
    printf("Errore nell'apertura del vecchio file");
    return ;
    }
    if (new==NULL){
    printf("Errore nell'apertura del nuovo file");
    return ;
    }
    while ((fgets(buffer,sizeof(buffer),f))!=NULL){
    sscanf(buffer,"%s",utente);
    if(strcmp(u,utente)!=0)
    fprintf(new,"%s\n",buffer);
    }

    fclose(f);
    fclose(new);
    if ((remove("connessi.txt")) || (rename("newconnessi.txt","connessi.txt")) ){
    printf("ERRORE!!!");
    return 0;
    }
    return 1;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    Ciao a tutti,

    non avendo risposta al precedente post e non riuscendo a trovare l'errore commesso, ho adottato un'altra soluzione che posterò tra un momento... E restando in attesa per una risposta dell'altro post (ormai è diventata una questione di principio) vorrei chiedervi: tra le due quale è la più efficiente?


    void disconnetti(char u[]){
    char buffer[MAXLINE],utente[MAXLINE];
    FILE *f, *new;
    f=fopen("connessi.txt","r");
    if((new=tmpfile())==NULL) //crea il file temporaneo
    err_sys("Cannot creat filetemp");
    if (f==NULL) {
    printf("Errore nell'apertura del vecchio file");
    return ;
    }
    while ((fgets(buffer,sizeof(buffer),f))!=NULL){
    sscanf(buffer,"%s",utente);
    if(strcmp(u,utente)!=0)
    fprintf(new,"%s",buffer);
    }
    fclose(f);

    fseek(new,0,SEEK_SET);
    if((f=fopen("connessi.txt","w"))==NULL) //il file viene chiuso e riaperto
    err_sys("open 2 error");
    while ((fgets(buffer,sizeof(buffer),new))!=NULL){
    fprintf(f,"%s",buffer);
    }
    fclose(f);
    fclose(new);
    }

    Quello che faccio qui, è copiare dal file originario al file temporaneo e dal temporaneo all'originario (troncando la lunghezza del file originario a zero).

    Se avete una soluzione migliore... Fatemi sapere! Grazie in anticipo

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non eseguire il rename e il remove nella stessa if ...

    Esegui PRIMA una if con il remove e DOPO un'altra if con il rename
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    Ciao grazie di aver risposto,

    Ho provato anche questo ma alla fine ho sempre lo stesso problema... ovvero il file connessi.txt nn viene cancellato e se tento di accedere mi da accesso negato. Però al posto della remove, ho tentato con unlink e il file viene cancellato ma cmq la remane nn viene effettuata... è come se esistesse sempre un riferimento del file connessi.txt... Infatti se nella rename metto un altro nome di file che nn esiste la rename viene fatta

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Mostra il codice dopo che lo hai modificato come ti ho detto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    Ecco il codice:

    int disconnetti(char u[]){
    char buffer[MAXLINE],utente[MAXLINE],nome[MAXLINE];
    FILE *f;
    FILE *new;

    f=fopen("connessi.txt","r");
    new=fopen("newconnessi.txt","w");

    if (f==NULL) {
    printf("Errore nell'apertura del vecchio file");
    return ;
    }
    if (new==NULL){
    printf("Errore nell'apertura del nuovo file");
    return ;
    }
    while ((fgets(buffer,sizeof(buffer),f))!=NULL){
    sscanf(buffer,"%s",utente);
    if(strcmp(u,utente)!=0)
    fprintf(new,"%s\n",buffer);
    }

    fclose(f);
    fclose(new);
    if (remove("connessi.txt")!=0){
    printf("ERRORE nella remove!!!");
    return 0;
    }
    if (rename("newconnessi.txt","connessi.txt")!=0) {
    printf("ERRORE nella rename!!!");
    return 0;
    }
    return 1;
    }

    dà errore nella rename... ma il file connessi.txt è sempre presente e non posso accedere perchè da accesso negato.

    Da qualche parte ho anche letto che il file deve essere chiuso prima di poter fare la remove o la rename cmq in ogni caso dà errore.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Scusa, ma come fai a compilare questo codice? Ci sono degli errori in compilazione ...

    Intanto non devi usare una variabile che si chiami new e poi la funzione disconnetti deve restituire sempre un valore in tutte le return ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    A me nn dà errori in fase di compilazione cmq ho fatto le modifiche che mi hai detto e
    si ferma in quel if della rename....

    Ti posto nuovamente il codice modificato:

    int disconnetti(char u[]){
    char buffer[MAXLINE],utente[MAXLINE],nome[MAXLINE];
    FILE *f;
    FILE *new1;

    f=fopen("connessi.txt","r");
    new1=fopen("newconnessi.txt","w");

    if (f==NULL) {
    printf("Errore nell'apertura del vecchio file");
    return 0;
    }
    if (new1==NULL){
    printf("Errore nell'apertura del nuovo file");
    return 0;
    }
    while ((fgets(buffer,sizeof(buffer),f))!=NULL){
    sscanf(buffer,"%s",utente);
    if(strcmp(u,utente)!=0)
    fprintf(new1,"%s",buffer);
    }

    fclose(f);
    fclose(new1);
    if (remove("connessi.txt")!=0){
    printf("ERRORE nella remove!!!");
    return 0;
    }
    if (rename("newconnessi.txt","connessi.txt")!=0) {
    printf("ERRORE nella rename!!!");
    return 0;
    }
    return 1;
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Se lavori con Windows, ottieni l'errore dopo la chiamata della rename con una GetLastError()
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    non lavoro in windows, sto usando cygwin in windows per compilare il programma... ma il programma è fatto per lavorare su linux...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.