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 une fonction de copie de fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Probleme avec une fonction de copie de fichier
    bonjour, pour un programme de sauvegarde de fichier SOUS WINXP, j'ai ecris une fonction de copie de fichier en c qui bug pendant l'execution.Dapres mes recherche mon problem vie de ma fonction fwrite mais je ne vois pa ce qui cloche. Ma fonction doit pouvoir utiliser pour fonctionnè deux chaines de caractaire declarer en variable globale au debut du programme. Quellequ'u pourait bien corriger l'erreur SVP. merci pour votre 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    static char * sources ="C:\\Documents and Settings\\Administrateur\\Bureau\\ibrahim ahamadi\\prog\\Projet_Prog\\versionC\\ft_copie\\Premier.url";
    static char * destination="C:\\Documents and Settings\\Administrateur\\Bureau\\ibrahim ahamadi\\prog\\Projet_Prog\\versionC\\ft_copie\\caca";
     
     
    void  copieFile(char * fileSource, char * fileDestination){
     
      int n;
      FILE * lacopie;
      FILE * lasource;
     
      lasource = fopen(fileSource, "rb");
      lacopie= fopen(fileDestination, "wb");
     
      do{
        fread(&n, sizeof(int), 1, lasource);
        if(!feof(lasource))  {fwrite(&n, sizeof(int), 1, lacopie);}
      }
      while(!feof(lasource));
    }
    int
    main(void){
      copieFile(sources,destination); return  0;
    }

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Plusieurs imperfections dans ce code:
    - verifier que les fopen() n'ont pas echoue.
    - verifier que fread() et fwrite() ont bien lu/ecrit le nombre d'elements demandes. feof() ne doit etre appele qu'apres la detection d'une erreur.
    - es-tu bien sur que la taille de ton fichier est un multiple de sizeof(int) ? En general, non: il faut donc changer ta facon de proceder.

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Lire de plus gros blocs de données ne serait il pas plus performant?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    La boucle de lecture/écriture devrait s'écrire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // ici il n'y a pas de test sur l'écriture puisque le retour de fwrite n'est pas testé
    while ((nb = fread(&n, sizeof(int), 1, lasource)) > 0)
        fwrite(&n, sizeof(int), nb, lacopie);
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par seriousme
    Lire de plus gros blocs de données ne serait il pas plus performant?
    Si. En general, on lit les fichiers dans un tampon de char de taille BUFSIZ (stdio.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char buffer[BUFSIZ];

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Trap D
    La boucle de lecture/écriture devrait s'écrire ainsi
    Puis tester avec "feof()" la cause de l'arrêt de la boucle de lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(feof(lasource)){
    /*la fin de fichier a été atteinte*/
    }
    else{
    /*une erreur de lecture s'est produite*/
    }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par DaZumba
    Si. En general, on lit les fichiers dans un tampon de char de taille BUFSIZ (stdio.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char buffer[BUFSIZ];
    Tu es sûr ? Il me semblait que cette constante n'avait qu'un seul but: Définir la taille du buffer INTERNE des fonctions de stdio.h parce qu'il est possible de le changer.
    Mais c'est vrai qu'envisagé sous cet angle, une taille multiple de BUFSIZ peut être optimale.
    Citation Envoyé par seriousme
    Puis tester avec "feof()" la cause de l'arrêt de la boucle de lecture:
    Je mets l'accent sur le puis.

    PS: mkacho : Déclare tes char * en "static const char * const source = ...". Le premier const est le plus important, il t'évitera de faire des bétises avec tes noms de fichiers.
    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.

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Médinoc
    Tu es sûr ? Il me semblait que cette constante n'avait qu'un seul but: Définir la taille du buffer INTERNE des fonctions de stdio.h parce qu'il est possible de le changer.
    Mais c'est vrai qu'envisagé sous cet angle, une taille multiple de BUFSIZ peut être optimale.
    C'est exactement ca. On pourrait utiliser n'importe quoi, mais puisque BUFSIZ existe, autant en profiter. Ce sera plus performant ou non, peu importe. La doc de la glibc ecrit a ce sujet:
    Sometimes people also use BUFSIZ as the allocation size of buffers used for related purposes, such as strings used to receive a line of input with fgets [...]. There is no particular reason to use BUFSIZ for this instead of any other integer, except that it might lead to doing I/O in chunks of an efficient size.

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

Discussions similaires

  1. Probleme avec une fonction de calcul d'un age
    Par dondano dans le forum Langage
    Réponses: 1
    Dernier message: 27/04/2007, 11h50
  2. Réponses: 5
    Dernier message: 25/09/2006, 11h06
  3. [C#] probleme avec une fonction recursive
    Par K_!!! dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/08/2006, 18h22
  4. probleme avec une fonction enable() toute simple !!
    Par K_!!! dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/05/2006, 15h10
  5. [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