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 :

Probleme avec la fonction rename()


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut [Resolu]Probleme avec la fonction rename()
    Bonjour
    Voila j'ai un petit probleme sur un petit bout de code.
    Je fais une copie d'un fichier vers un autre et je veux supprimer l'ancienne version du fichier.
    Seulement la fonction ne fait pas son office et ne renomme pas le fichier comme je voudrais. Je stocke les noms dans des chaines de caractères. J'ai essayé en utilisant des noms entre double quote, mais j'ai le meme résultat....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char tmp[10], name[20];
     
    debug = rename (tmp, name);
    L'affichage de debug m'indique -1.

    Help please. Je précise je suis sur mac. Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Probleme avec la fonction rename()
    Citation Envoyé par TheZenZen
    Voila j'ai un petit probleme sur un petit bout de code.
    Je fais une copie d'un fichier vers un autre et je veux supprimer l'ancienne version du fichier.
    Seulement la fonction ne fait pas son office et ne renomme pas le fichier comme je voudrais. Je stocke les noms dans des chaines de caractères. J'ai essayé en utilisant des noms entre double quote, mais j'ai le meme résultat....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char tmp[10], name[20];
     
    debug = rename (tmp, name);
    L'affichage de debug m'indique -1.
    Ben si il n'y a rien de défini dans tmp et name, ça va pas le faire...

    Montre le code complet mais réduit au minimum compilable qui montre le défaut.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bah j'ai bien évidement des données dans le tableau... Je ne pense pas que le probleme vient de la...
    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
    22
    23
    24
    25
    26
     
    int fonction(char *name, int numero)
    {
    	char tmp[10] = "temp";
    	char ligne[1000];
    	char * fin;
    	int debug;
     
    	FILE *input;
    	FILE *output;
     
    	output = fopen(name, "r");
    	input = fopen(tmp, "a+");
     
    	while(fin != NULL)
    	{
    		fin = fgets(ligne, 1000, output);
    		fprintf(input, "%s", ligne);
    	}
    	fclose(output);
     
    	remove (name);
    	debug = rename (tmp, name);
    	printf("%d\n", debug);
    	return 0;
    }
    Voila ce que ca donne en simplifier. Tout marche sauf la fonction rename...

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TheZenZen
    Voila ce que ca donne en simplifier. Tout marche sauf la fonction rename...
    Quels sont les mots que tu ne comprends pas dans
    Montre le code complet mais réduit au minimum compilable qui montre le défaut.
    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
     
    Compiling: main.c
    main.c: In function `fonction':
    main.c:8: error: `FILE' undeclared (first use in this function)
    main.c:8: error: (Each undeclared identifier is reported only once
    main.c:8: error: for each function it appears in.)
    main.c:8: error: `input' undeclared (first use in this function)
    main.c:9: error: `output' undeclared (first use in this function)
    main.c:11: warning: implicit declaration of function `fopen'
    main.c:14: error: `NULL' undeclared (first use in this function)
    main.c:16: warning: implicit declaration of function `fgets'
    main.c:16: warning: assignment makes pointer from integer without a cast
    main.c:17: warning: implicit declaration of function `fprintf'
    main.c:19: warning: implicit declaration of function `fclose'
    main.c:21: warning: implicit declaration of function `remove'
    main.c:22: warning: implicit declaration of function `rename'
    main.c:23: warning: implicit declaration of function `printf'
    main.c: At top level:
    main.c:1: warning: unused parameter 'numero'
    A première vue :
    • pas de test après ouverture des fichiers
    • 'name' devrait être l'entrée et 'tmp' la sortie... De meilleurs noms évitent de se tromper.
    • Pourquoi "a+" ? Qu'est-ce qui ne va pas avec "a" ?
    • Tous les fichiers ouverts ne sont pas fermés.
    • Le code retour de remove() n'est pas testé.

    remove() d'un fichier non fermé invoque un comportement indéfini...

    Quelque chose comme ça :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <stdio.h>
    #include <assert.h>
     
    static int fonction(char const *f_in, int numero)
    {
        int err = 0;
        static char const f_out[] = "temp";
     
        if (f_in != NULL)
        {
            FILE *input = fopen(f_in, "r");
     
            if (input != NULL)
            {
                FILE *output= fopen(f_out, "w");
     
                if (output!=NULL)
                {
                    unsigned long line_count=0;
                    char ligne[1000];
     
                    while(fgets(ligne, sizeof ligne, input) != NULL)
                    {
                        line_count++;
                        fprintf(output, "%s", ligne);
                    }
                    fclose(output), output=NULL;
                    printf("%lu line%s copied\n", line_count, line_count>1?"s":"");
                }
                else
                {
                    err=1;
                    perror(f_out);
                }
                fclose(input), input=NULL;
     
                assert(output==NULL);
                assert(input==NULL);
     
                if (!err)
                {
                    int debug = remove(f_in)
                                ;
                    printf("remove: %d\n", debug);
     
                    debug = rename (f_out, f_in);
                    printf("rename: %d\n", debug);
                }
            }
            else
            {
                err=1;
                perror(f_in);
            }
        }
        else
        {
            err=1;
        }
        return err;
    }
     
    int main (void)
    {
        fonction("test.txt", 10);
     
        return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Désolé je n'avais pas compris que tu allais le compiler...
    Néanmoins

    pas de test après ouverture des fichiers
    Je n'en fais aucun, je vais essayer d'en faire, meme si je n'ai jamais eu d'erreur d'ouverture....
    'name' devrait être l'entrée et 'tmp' la sortie... De meilleurs nom évitent de se tromper.
    J'utilise input et ouput, mais pour l'exemple j'avais modifier le code...
    Pourquoi "a+" ? Qu'est-ce qui ne va pas avec "a" ?
    Merci je n'avais pas vu.
    Tous les fichiers ouverts ne sont pas fermés.
    Mauvaise recopie, désolé.
    Le code retour de remove() n'est pas testé.
    Je n'ai aucun probleme avec cette fonction, dans mon code elle me renvoie bien '0' donc no soucy la dessus....

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TheZenZen
    pas de test après ouverture des fichiers
    Je n'en fais aucun, je vais essayer d'en faire, meme si je n'ai jamais eu d'erreur d'ouverture....
    Comment tu le sais si tu ne fais pas le test ?
    'name' devrait être l'entrée et 'tmp' la sortie... De meilleurs nom évitent de se tromper.
    J'utilise input et ouput, mais pour l'exemple j'avais modifier le code...
    Visiblement input et output sont inversés...
    Le code retour de remove() n'est pas testé.
    Je n'ai aucun probleme avec cette fonction, dans mon code elle me renvoie bien '0' donc no soucy la dessus....
    Peut être...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bon je viens de réussir à obtenir ce que je voulais.
    Ce que j'ai fait c'est recopier la chaine de caractère que je passais en argument dans une autre chaine, et la ca marche....
    Je ne comprend pas puisque j'ouvre mes fichiers en utilisant la chaine de caractère que je passe en argument...

    Bizarre

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

Discussions similaires

  1. probleme avec la fonction rename
    Par pierre5897 dans le forum Débuter
    Réponses: 3
    Dernier message: 20/08/2013, 19h15
  2. Probleme avec la fonction Ontimer
    Par Djule dans le forum MFC
    Réponses: 8
    Dernier message: 27/11/2005, 17h52
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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