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 :

Putc n'écrit pas dans le fichier ?


Sujet :

C

  1. #1
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut Putc n'écrit pas dans le fichier ?
    Bonjour,

    Je dois faire un "petit" programme qui simule la fonction copy du DOS. Seulement, j'ai un petit problème avec la commande putc (le prof veut qu'on utilise exclusivement putc et getc pour la lecture/écriture). Voici le bout de code qui fait le travail :

    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
     
       printf("BEGIN => We are at octet %d\n", ftell(dst));
     
       while(!feof(src))
       {
          ch = getc(src);
          printf("%c", putc(ch, dst));
    //    printf("%c", ch);
       }
     
       printf("\nEND => We are at octet %d\n", ftell(dst));
     
       printf("\n\nOperation terminated \n");
     
       fclose(src);
       fclose(dst);
    Le code complet ainsi qu'une trace d'exécution se trouve dans cette archive :
    => http://gtemgoua.developpez.com/tmp/CopyFile.zip
    (code source + trace d'exécution + fichier help.txt + .exe)

    Le fichier help.txt contient la description des paramètres d'appels.

    En gros, on utilise la fonction pour copier un fichier vers une destination, et avec l'argument -a on peut ajouter le fichier source à la fin du fichier destination. Au premier appel (le fichier destination n'existe pas), tout se passe bien :

    BEGIN => We are at octet 0
    #include <io.h>
    #include <stdio.h>
    #include <conio.h>
    #include <dir.h>
    #include <dirent.h>
    #include <string.h>
    #include <sys\stat.h>
    #include <fcntl.h>*
    END => We are at octet 159
    J'écrit sur la console la position du pointeur dans le fichier.

    Au second appel, "pareil" :

    BEGIN => We are at octet 159
    #include <io.h>
    #include <stdio.h>
    #include <conio.h>
    #include <dir.h>
    #include <dirent.h>
    #include <string.h>
    #include <sys\stat.h>
    #include <fcntl.h>*
    END => We are at octet 318
    sauf que dans ce cas, RIEN du tout n'est écrit dans le fichier, pourtant on voit bien que la position du pointeur dans le fichier a changé !!!! Mais sur la console, le contenu du fichier source est bien écrit !

    Pour ceux qui n'ont pas le temps de regarder l'archive, voici comment j'associe le flux au handle du fichier (d'après l'aide, un flux associé de cette façon peut être utilisé en lecture comme en écriture) :

    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
     
    	int handle = open(DestPath, OpenMode, S_IREAD | S_IWRITE);
     
    	if(handle == -1)
    	{
    		perror("Error : ");
    		return;
    	}
     
    	if(strcmpi(FileMode,"a") == 0)
    	{
    		if(lseek(handle, filelength(handle), SEEK_SET) == -1L)
    			perror("Seek : ");
     
    		printf("\nseeking...\n");
    	}
     
    	FILE* dst =  fdopen(handle, FileMode);
    OpenMode est définit plus haut par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int OpenMode = (strcmp(FileMode, "a") == 0)?O_CREAT | O_APPEND:O_CREAT;
    où FileMode désigne le mode d'ouverture passé en paramètre à la fonction qui fait la copie.

    Pourrais-t-on m'expliquer pourquoi l'appel à putc écrit bien sur la console mais pas dans le fichier ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bonjour,
    1) Ce n'est pas un handle, mais un descripteur. Sous Windows, les trois niveaux existent, alors autant éviter de les confondre.
    2) Pourquoi ne fais-tu pas directement un fopen() ?
    3) On dirait que tu oublies de te donner les droits d'écriture en ouvrant le fichier... (O_WRONLY ou O_RDWR)...
    4) tu devrais utiliser des parenthèses dans ta définition de OpenMode, pour plus de clarté.

  3. #3
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Citation Envoyé par Médinoc
    1) Ce n'est pas un handle, mais un descripteur. Sous Windows, les trois niveaux existent, alors autant éviter de les confondre.
    Je ne confondais pas en fait disons que j'ai utilisé un nom de variable "incorrect"

    Citation Envoyé par Médinoc
    2) Pourquoi ne fais-tu pas directement un fopen() ?
    Le fichier de destination n'existe pas forcément. Donc il me faut faire un appel à creat ou à open, et chacune de ces deux fonctions me retourne un descripteur. Il me faut ensuite faire un fdopen pour recupérer le flux...

    Citation Envoyé par Médinoc
    3) On dirait que tu oublies de te donner les droits d'écriture en ouvrant le fichier... (O_WRONLY ou O_RDWR)...
    Comment cà ?
    je fais bien un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open(DestPath, OpenMode, S_IREAD | S_IWRITE);
    De toutes les façons, cà marche pour une copie "normalle" mais lorsqu'il s'agit de faire un append (c'est pourquoi je spécifie le mode O_CREAT | O_APPEND) cà ne marche pas mais d'après ce qu'on peut lire sur l'écran, le pointeur se déplace bien dans le fichier !!!

    Citation Envoyé par Médinoc
    4) tu devrais utiliser des parenthèses dans ta définition de OpenMode, pour plus de clarté.
    OK

    As-tu télécharger l'archive ? Pourrais-tu le faire ? Le code complet se trouve dedans, et tu n'auras même pas besoin de compiler, y'a l'exécutable avec...

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Giovanny Temgoua
    Le fichier de destination n'existe pas forcément. Donc il me faut faire un appel à creat ou à open, et chacune de ces deux fonctions me retourne un descripteur. Il me faut ensuite faire un fdopen pour recupérer le flux...
    Ben je ne vois pas trop le rapport... fopen("w") crée le fichier s'il n'existe pas (pour les permission par défaut, par contre, je ne sais pas trop, mais je crois bien que tu as les droits en lecture et écriture...)
    Et je crois bien qu'il en est de même pour fopen("a");
    Citation Envoyé par man fopen (freeBSD 4.10)
    ``w'' Truncate file to zero length or create text file for writing.
    The stream is positioned at the beginning of the file.

    ``a'' Open for writing. The file is created if it does not exist. The
    stream is positioned at the end of the file. Subsequent writes
    to the file will always end up at the then current end of file,
    irrespective of any intervening fseek(3) or similar.
    Citation Envoyé par man fopen (HP-UX 11)
    w or wb truncate to zero length or create
    file for writing

    a or ab append; open file for writing at
    end of file, or create file or
    writing
    Et visiblement, le man est de mon avis...

    Citation Envoyé par Giovanny Temgoua
    Comment cà ?
    je fais bien un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open(DestPath, OpenMode, S_IREAD | S_IWRITE);
    De toutes les façons, cà marche pour une copie "normalle" mais lorsqu'il s'agit de faire un append (c'est pourquoi je spécifie le mode O_CREAT | O_APPEND) cà ne marche pas mais d'après ce qu'on peut lire sur l'écran, le pointeur se déplace bien dans le fichier !!!
    Ici, je ne parlais pas des droits du fichier (S_I*) mais de ceux du descripteur (O_*) : Quand on ouvre un fichier, on spécifie généralement la façon dont on y accède: O_RDONLY, O_WRONLY et O_RDWR en combinaison avec les autres flags (O_CREAT etc.).

  5. #5
    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 : 68
    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: Putc n'écrit pas dans le fichier ?
    Citation Envoyé par Giovanny Temgoua
    Je dois faire un "petit" programme qui simule la fonction copy du DOS. Seulement, j'ai un petit problème avec la commande putc (le prof veut qu'on utilise exclusivement putc et getc pour la lecture/écriture). Voici le bout de code qui fait le travail :

    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
     
       printf("BEGIN => We are at octet %d\n", ftell(dst));
     
       while(!feof(src))
       {
          ch = getc(src);
          printf("%c", putc(ch, dst));
    //    printf("%c", ch);
       }
     
       printf("\nEND => We are at octet %d\n", ftell(dst));
     
       printf("\n\nOperation terminated \n");
     
       fclose(src);
       fclose(dst);
    feof() ne fait pas ce que tu crois (C != Pascal). Il faut tester le code retourné par la fonction de lecture :

    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Pour ouvrir le fichier :
    lecture binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE *fp_src = fopen("source", "rb");
    ecriture binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE *fp_des = = fopen("destination", "wb");

  6. #6
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Merci à vous Messieurs.

    J'ai modifié la boucle et maintenant j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while((ch = getc(src)) != EOF)
    {
       printf("%c", putc(ch, dst));
    }
    Et cà fonctionne mieux en effet

    Encore un petit souci avec les fichiers binaires quand même

    J'utilise le mode w+b pour ouvrir un .exe que j'aimerait copier mais je n'atteint jamais la fin du fichier

    Après le code ci-dessus, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!feof(src))
      printf("Have not reached the end of file. The copy operation may have lost \n");
    pour un fichier binaire, j'ai ce message à tous les coups...

    Merci. Je vais bien relire ces notes

  7. #7
    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 : 68
    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 Giovanny Temgoua
    J'utilise le mode w+b pour ouvrir un .exe que j'aimerait copier mais je n'atteint jamais la fin du fichier
    Pourquoi "w+b" ? C'est "wb" pour un fichier binaire.

  8. #8
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Merci beaucoup.

    Problème résolu.

    En fonction de l'extension des fichiers, je détecte s'il faut faire une copie texte ou binaire. Maintenant tout fonctionne impecc

  9. #9
    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 : 68
    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 Giovanny Temgoua
    En fonction de l'extension des fichiers, je détecte s'il faut faire une copie texte ou binaire. Maintenant tout fonctionne impecc
    Bof, la copie binaire marche à tout les coups... Et quand il n'y a pas d'extension ?

  10. #10
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    La copie binaire est utilisée par défaut

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La copie texte n'est généralement utile que pour transmettre un fichier texte d'un système à un autre.
    Et encore, on aimerait bien que le $("éè^'"*ù^"é$ de client FTP en ligne de commande de Windows ne fasse pas "Tout en mode texte" par défaut...

  12. #12
    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 : 68
    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 Médinoc
    La copie texte n'est généralement utile que pour transmettre un fichier texte d'un système à un autre.
    Et encore, on aimerait bien que le $("éè^'"*ù^"é$ de client FTP en ligne de commande de Windows ne fasse pas "Tout en mode texte" par défaut...
    Essaye donc FIleZilla...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/03/2011, 14h35
  2. Réponses: 4
    Dernier message: 14/07/2010, 10h12
  3. Réponses: 3
    Dernier message: 24/03/2010, 20h56
  4. Entrées de glossaire n'apparaissent pas (dans des fichiers chapter.tex)
    Par petilu63 dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 26/05/2009, 14h42

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