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 :

Copier des fichiers dans un autre dossier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Par défaut Copier des fichiers dans un autre dossier
    Bonjour,
    J'essaye de copier des fichiers dans un autre dossier, j'arrive à les créer s'il n'existe pas dans le dossier de destination mais plus rien après... Voici mon code en espérant pouvoir obtenir une petite aide !

    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
     
    #include <stdio.h>
     
    int     archive(int argc, char **argv)
    {
      char  buffer[256];
      int   i;
      FILE  *f;
      FILE  *f1;
     
      i = 2;
      f1 = fopen(argv[1], "r+");
      if (mkdir (argv[1], 0777) == -1)
        return (-1);
      if (chdir(argv[1]) == -1)
        return (-1);
      while (i < argc && fopen(argv[i], "w+") != NULL)
        {
          f = fopen(argv[i], "w+");
          while (!feof(f1))
            {
              fputs(buffer, f);
              fgets(buffer, 255, f1);
            }
          i++;
        }
    }
     
    int     main(int argc, char **argv)
    {
      archive(argc, argv);
    }
    Merci à vous !

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Il y a trop d'erreurs dans ce code pour simplement les énumérer. Le conseil que je te donne est de réécrire la fonction archive pour un seul fichier tout d'abord, en écrivant en commentaire après chaque ligne sa justification, c'est-à-dire ce qu'elle est sensée faire selon toi. Tu dois comprendre le rôle exact de chaque instruction.

    Referme tes fichiers lorsque tu as terminé de les manipuler.

    Pourquoi fgets / fputs, c'est une contrainte imposée ? Pour copier le contenu d'un fichier, utilise plutôt fread / fwrite en mode binaire (voir la documentation de fopen).

    Place toujours des assert à la suite des appels système (fopen, fread...) pour vérifier le résultat. Puis lorsque le programme te semble fonctionner correctement, remplace-les par une gestion d'erreur digne de ce nom (envoi d'un message à l'utilisateur, nettoyage des ressources...).

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    De plus, on ne peut pas fopen() un dossier, et je ne vois pas pourquoi tu ouvres tes fichiers en lecture/écriture alors qu'une opération de copie demande seulement une lecture seule et une écriture seule.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 852
    Billets dans le blog
    1
    Par défaut
    Bonjour

    feof() ne sert pas à détecter une fin de fichier, mais indique, si la lecture du fichier ne se fait pas (ne se fait plus), si l'arrêt de la lecture est dû au fait qu'on soit arrivé à la fin (parce qu'il y a aussi d'autres raisons possibles comme par exemple une erreur d'accès).

    Il en résulte que quand tu utilises feof() pour détecter la fin de fichier, tu fais une lecture de plus que nécessaire. En effet, si le fichier contient 5 lignes, et que tu fais 5 fgets(), feof() ne détecte rien. C'est au 6° fgets() que le flag est alors levé mais c'est trop tard, tu es déjà dans la boucle.
    Pour détecter une fin, suffit de regarder le code retour de la fonction utilisée. Si ce code retour prend la valeur spéciale "fin de fichier", alors tu n'entres pas dans la boucle.
    Typiquement ici ce serait while (fgets(...) != NULL) { ... (recopie de la ligne lue dans le fichier n° 2) ... }.

    Sinon ben des remarques plus générales
    • une recopie signifie "lecture f1 puis écriture f2" (enfin c'est un petit peu la philosophie que j'emploie quand je recopie un texte: je le lis d'abord ; et en général, ça fonctionne plutôt bien). Or toi, tu fais "écriture f2 puis lecture f1" ce qui, à priori, me parait moins efficient (écrire un texte avant de l'avoir lu... mais bon, peut-être qu'avec les nouvelles technos...)
    • tantôt tu considères argv[1] comme un dossier, tantôt comme le fichier à recopier (ou alors je ne pige rien à ce que tu as fait)
    • tu fais des fopen() dans tous les sens mais tu ne fermes jamais ce que t'as ouvert (t'as d'autres outils pour détecter l'existence d'un fichier sans avoir besoin de l'ouvrir)
    • fgets()+fputs() sont des fonctions à priori dédiées à la manipulation de fichiers textes. Alors ok, un texte ce n'est que de l'octet et une vidéo aussi donc ça fonctionnera aussi pour une vidéo mais ces fonctions font des opérations de contrôle quand elles sont appelées (enfin je parle surtout pour fgets() qui cherche les '\n' dans le flux récupéré) et ces opérations sont alors inutile pour une vidéo d'où un traitement plus long que nécessaire. Et en plus, quand je dis que ça fonctionnera pour une vidéo, c'est seulement dans le monde Unix/Linux qui ne fait pas de distinction texte/binaire parce que sous Windows, ça te rajoutera du \r' à chaque '\n' donc là, ta vidéo...
      Pour traiter du fichier sans état d'âme (ce que fait une bête copie), t'as open+read+write+close sinon fopen+fread+fwrite+fclose
    • inutile d'enlever 1 octet à la taille passée à fgets() car la fonction s'occupe elle-même de réserver un octet pour le '\0' (elle enlève 1 à la valeur reçue)
    • au lieu de tout mettre dans le main (ce qui n'est effectivement pas bien), tu mets tout dans une grosse fonction et ton main se réduit à appeler la grosse fonction. Ben ça, ce n'est pas bien mieux. Tu devrais revoir le principe de découpage des actions (voir la remarque de Matt_Houston sur la fonction dédiée à la recopie d'un fichier)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. copier des fichiers dans un dossier
    Par identifiant_bidon dans le forum ANT
    Réponses: 3
    Dernier message: 25/05/2011, 15h40
  2. Réponses: 9
    Dernier message: 20/02/2009, 17h51
  3. transférer des fichiers dans un autre dossier de façon dynamique
    Par soria_t dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/08/2008, 16h28
  4. rechercher des fichiers dans tous les dossiers
    Par nitteo dans le forum MFC
    Réponses: 4
    Dernier message: 23/06/2006, 18h08
  5. Réponses: 3
    Dernier message: 12/04/2006, 20h44

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