IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème au niveau de la fonction remove


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut Problème au niveau de la fonction remove
    Bien le bonjour ,
    Je suis étudiant dans une école d'ingénieur en informatique en 1ère année . Je suis en train de réaliser un petit logiciel sur console qui permettrait à des professeurs (avec leurs comptes) d'école d'ajouter ou de supprimer les absences de leurs élèves.

    En plus des professeurs , il existe aussi des comptes administrateurs pouvant ajouter/supprimer des classes ou des utilisateurs , et aussi des comptes élèves (ceux-ci pourront lister leurs absences selon la date/matière)


    Je vous expose donc mon problème . Mon logiciel utilise le système de fichiers. Les absences sont notées dans le fichier de l'élève par exemple .. Même chose pour les matières ou les comptes d'utilisateurs qui ont leurs propres fichiers à eux.

    J'ai un problème au niveau de la fonction remove() , que j'ai utilisée à maintes fois dans le code, notamment dans les fonctions de suppression ( supprimerUtilisateur / supprimerClasse / supprimerMatière etc. ) Pour supprimer une matière (dans le fichier matieres.txt), je procède comme suit :
    Je crée un fichier temp.txt qui contiendra tout le contenu de matieres.txt , sauf la matière que je veux supprimer.
    Je supprime ensuite le fichier matieres.txt grâce à la fonction remove(), puis renomme le fichier temp.txt en matieres.txt grâce à rename(). Ni vu ni connu .


    Cependant , la fonction remove ne marche absolument pas. Je me retrouve donc avec un fichier matieres.txt intact , et un fichier temp.txt qui contient toutes les matières sauf celle qui est supprimée .

    J'ai essayé à maintes fois de trouver l'origine du problème . Peut être est-ce à cause de la non-fermeture d'un fichier ... En tout cas , ça fait 2 semaines que j'essaye de régler ce problème , mais rien n'y fait ... C'est pourquoi je vous demande votre aide . Je joins à ce message le fichier rar du projet , qui contient le main.c ainsi que les fichiers d'élèves/matières/comptes

    Merci d'avance

    PS : pour le compte admin , login : admin / pass : admin et le compte prof , login : p / pass : p
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Bonsoir et bienvenue,

    Tu ne testes pas la valeur de retour de remove(), qui peut pourtant échouer.

    Cette fonction renvoie 0 si tout s'est bien passé et -1 dans le cas contraire. Tu peux utiliser perror("") pour obtenir un message à l'écran indiquant en toutes lettres ce qu'il s'est passé.

    Par ailleurs, créer un second fichier pour supprimer des enregistrements est une pratique courante, mais qui n'est pas sans poser problème : http://www.developpez.net/forums/d10...r/#post6012305

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    Bonsoir et merci pour l'acceuil
    J'ai déjà auparavant affiché la valeur de retour de remove() , ça m'a affiché -1 .
    Je viens d'essayer tout à l'heure avec perror , ça m'a affiché " Permission denied" .
    Comme je l'ai écrit dans mon précédent post , je pense que l'erreur vient d'un fichier qui n'a pas été fermé avec fclose auparavant . J'ai cependant cherché partout et je n'ai pas trouvé d'où venait le problème

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Comme son nom l'indique, « permission denied », ça veut dire « permission refusée ». Un fichier ouvert ne t'empêche pas de le supprimer, en principe (il disparaît effectivement du disque qu'au moment où le dernier descripteur est refermé).

    La première chose qu'il faut regarder, ce sont les droits d'accès du fichier (avec « ls -l »). Il y a de fortes chances pour qu'il soit créé par défaut en read-only. L'absence du bit « w » t'empêcherait de le supprimer, même si la commande Shell la rajoute elle-même après confirmation éventuelle.

    Ensuite, il faut vérifier si le nom de fichier que tu passes à remove() est bien le bon, notamment au niveau des chemins d'accès.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    Je précise tout d'abord que je suis sur Windows, donc j'ai fait clic-droit->propriétés sur le fichier matieres.txt . Il n'était pas en mode lecture seule .

    Tout à l'heure j'ai essayé d'appeler la fonction SupprimerMatiere au tout début du programme , c'est à dire au début de la fonction main, de cette façon :
    SupprimerMatiere ("Maths");

    Résultat : La modification a bien eu lieu , c'est à dire que le fichier matieres.txt a été supprimé et que le fichier temporaire a bien été renommé en matieres.txt . Le problème vient donc d'autre part . (je cherche encore et toujours )

  6. #6
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Bonjour,
    J'ai regardé ton code, (pas testé ^^)

    Juste une chose avant de commencer,
    D'après la composition de l'archive,
    Tu sembles utiliser un IDE style Visual ou autre ...
    Donc pour plus de clarté,
    Pense à la programmation modulaire (dans plusieurs fichier)

    Évite les exit(0); en plein milieu du code,
    Favorise la remonté des erreurs.

    Et aussi, les indentations sont parfois spéciales =/
    Essaye de régler ton IDE pour qu'il le fasse tout seul ^^

    Bon sinon,
    Mis à part mon petit dégout sur l'ouverture/fermeture sans cesse de fichiers,
    ( essaye si possible de garder le moins longtemps un fichier ouvert
    . par exemple, dans ajouterUti
    . Tu ouvres f au début pour ne t'en servir qu'une fois à la fin ... )

    J'ai remarqué que la fonction appel ouvre un fichier sans jamais le refermer.

    dans la fonction supprimerAbsence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void supprimerAbsence (char matiere[], char fichierEleve[], date d1)
    {
        FILE *f = NULL;
        FILE *g = NULL;
        /* [...] */
        f=fopen(fichierEleve,"r");
        g=fopen("temp.txt","w");
        if (f==NULL || g == NULL)
        {
            printf("Erreur");
        }
        else
        {
            /* [...] */
            remove(fichierEleve);
            rename("temp.txt",fichierEleve);
        }
        fclose(f);
        fclose(g);
    }
    Tu fermes les fichiers même s'ils ne sont pas ouvert Oo
    Et pourquoi tu ne les ferme pas avant de les renommer & co ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void supprimerAbsence (char matiere[], char fichierEleve[], date d1)
    {
        FILE *f = NULL;
        FILE *g = NULL;
        /* [...] */
        f=fopen(fichierEleve,"r");
        g=fopen("temp.txt","w");
        if (f==NULL || g == NULL)
        {
            printf("Erreur");
        }
        else
        {
            /* [...] */
            fclose(f);
            fclose(g);
            remove(fichierEleve);
            rename("temp.txt",fichierEleve);
        }
    }
    (surtout que tu le fais dans une autre fonction ^^)

    et sinon, bon c'est sous linux mais vu que c'est C89, Microsoft doit faire la même ^^
    man rename
    C'est dit que rename écrasera le fichier,
    Donc peut être que la fonction remove n'a pas le temps de finir
    Avant ton appel à rename et que ça bloque ...
    Essaye avec juste rename pour voir ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème au niveau de fonction
    Par marguerite99 dans le forum C
    Réponses: 4
    Dernier message: 31/10/2009, 16h38
  2. problème au niveau de l'appel d'une fonction
    Par kawther dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/06/2009, 20h15
  3. problème au niveau de restore database
    Par Redouane dans le forum Administration
    Réponses: 2
    Dernier message: 07/09/2005, 11h49
  4. Problème de titre avec la fonction window.open
    Par kloss dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/04/2005, 18h34
  5. [DNS MX]Avec DynDNS.org, problème au niveau du MX
    Par Swoög dans le forum Développement
    Réponses: 9
    Dernier message: 24/08/2004, 22h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo