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

Réseau C Discussion :

comment copier caractère par caractère des données d'un fichier binaire dans un char


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut comment copier caractère par caractère des données d'un fichier binaire dans un char
    comment copier caractère par caractère des données d'un fichier binaire dans un char * ??

    j en ai besoin pour ma fonction segmentation et j'avoue que je desespère??

  2. #2
    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
    Tu as essayé fgetc ?

  3. #3
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Pourquoi pas tout simplement un fread ?

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par angy_y
    comment copier caractère par caractère des données d'un fichier binaire dans un char * ??

    j en ai besoin pour ma fonction segmentation et j'avoue que je desespère??
    Si c'est caractère par caractère, fgetc() est tout indiqué. Si c'est par blocs de caractères (sans que l'on veuille que cela représente une chaine) => fread().

    Exple avec fgetc() :
    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
    #include <stdio.h>
    int main(void)
    {
      FILE * f = NULL;
      int cR;
      char c;
      f =  fopen("machin.bin", "rb");
      if (f) {
        while ( (cR = fgetc(f)) != EOF )
        {
           c = cR;
           /* faire qqchose avec c */
        }
        if (ferror(f)) { fprintf(stderr, "error while reading machin.bin!\n"); }
        fclose(f);
      }
     
      return 0;
    }
    A+

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Foobar1329
    Si c'est caractère par caractère, fgetc() est tout indiqué. Si c'est par blocs de caractères (sans que l'on veuille que cela représente une chaine) => fread().

    Exple avec fgetc() :
    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
    #include <stdio.h>
    int main(void)
    {
      FILE * f = NULL;
      int cR;
      char c;
      f =  fopen("machin.bin", "rb");
      if (f) {
        while ( (cR = fgetc(f)) != EOF )
        {
           c = cR;
           /* faire qqchose avec c */
        }
        if (ferror(f)) { fprintf(stderr, "error while reading machin.bin!\n"); }
        fclose(f);
      }
     
      return 0;
    }
    A+


    mais je ne vois pas le rapport avec mon char*.. car j'ai mes données à envoyer dans mon Buff que j'ai déclaré ainsi :
    char * Buff ;
    RBuff = (512 * malloc sizeof(char));
    File * sortie;

    Comment faire avec fgetc pour copier caractère par caractère ( pour ne pas dépasser une taille précise )de sortie DANS mon Buff.. ????

  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 angy_y
    mais je ne vois pas le rapport avec mon char*.. car j'ai mes données à envoyer dans mon Buff que j'ai déclaré ainsi :
    char * Buff ;
    RBuff = (512 * malloc sizeof(char));
    File * sortie;

    Comment faire avec fgetc pour copier caractère par caractère ( pour ne pas dépasser une taille précise )de sortie DANS mon Buff.. ????
    Ta question est mal posée. Tu veux lire un fichier par bloc et l'envoyer avec send(), c'est ç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
     
    /* ouverture fichier et socket, connexion... */
     
    char buffer[512];
    size_t n;
     
    while ((n = fread (buffer, 1, sizeof buffer, fp)) != 0)
    {
       if (send (sock, buffer, n, 0) != n)
       {
          /* erreur de taille... */
       }
    }
     
    /* fermeture */

  7. #7
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par angy_y
    mais je ne vois pas le rapport avec mon char*.. car j'ai mes données à envoyer dans mon Buff que j'ai déclaré ainsi :
    char * Buff ;
    RBuff = (512 * malloc sizeof(char));
    File * sortie;
    Drôle de nom "sortie" si c'est le fichier source des données.
    C'est quoi ce (512 * malloc sizeof(char)); ?

    Tu multiplies l'adresse récupérée pour ton espace mémoire allouée par 512 !!
    En gros, quand tu fais le free, si tout va bien (valeur de RBuff non modifiée), faut diviser par 512 avant

    RBuff = malloc(512 * sizeof*RBuff);

    Signification : je veux de l'espace mémoire pour 512 objets de la taille de ce qui est pointée par RBuff, à savoir, 512 char. Par définition, sizeof(char) vaut 1, mais je n'aime pas remplacer les sizeof(char) par 1 cacr ça peut créer des ennuis le jour ou tu changes de type (exple: si je passe en wchar_t pour de l'internationalisation de code, je n'ai qu'à passer char * RBuff en wchar_t * RBuff sans toucher au malloc() ).

    Citation Envoyé par angy_y
    Comment faire avec fgetc pour copier caractère par caractère ( pour ne pas dépasser une taille précise )de sortie DANS mon Buff.. ????
    [/quote]
    Hopala,

    dans ce cas, c'est de la lecture par blocs avec fread() qu'il faut faire...

    J'ai écrit un petit exemple l'autre jour ici :
    http://www.developpez.net/forums/sho...66&postcount=4

    Sinon si tu tiens à rempir uniquement RBuff caractère par caractère avec fgetc()...
    exple: 512 premiers caracteres de ton fichier

    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
    char * RBuff = NULL;
    FILE * entree = NULL;
     
    entree = fopen("bidule", "r" /* "rb" ptet ?*/);
    if (entree)
    {
        RBuff = malloc (512*sizeof*RBuff);
        if (RBuff) {
            int i, cLu;
            for(i=0; i < 512; ++i) {
                cLu = fgetc(entree);
                if (cLu == EOF) { break; }
                 RBuff[i] = cLu;
            }
            /* faire qquchose */
            free(RBuff); RBuff = NULL;
        }
        fclose(entree); entree=NULL;
    }
    Ne pas oublier stdlib.h ainsi que de traiter les cas où ca va pas bien.

    A+

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je vais etre plus clair. voila mon code de la fonction segmentation
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define mss 512; 
     
     
    char * segmentation (....) {
     
    FILE *sortie;
    char *RBuff;
    RBuff =  (mss * malloc (sizeof(char)));
     
    char BuffInter; 
     long taille;
     long savepos;
    sortie =fopen("message_test","wb+"); // ouverture du fichier msg_test
     
    if (sortie=NULL) 
     {
      fprintf("Erreur dans l'ouverture du fichier");//cas fichier Ã* envoyer
      exit(-1);
     }
    else 
    {
      fprintf("sortie,"azertyuiopAZERTY");
     
      savpos=ftell(sortie);
      fseek(sortie, 0, SEEK_END);
      taille=ftell(sortie);
      fseek(stream, long, SEEK_SET);
      return taille;
     
            while(fread(RBuff, sizeof(char),1,sortie),!feof(sortie)); //lecture
              {
                car=0;               
     	   	   	if (taille<=size || car<=mss)                          
    	               {  
                          fseek(sortie,sizeof(char),SEEK_SET); // positionne l indicateur pour la lecture
            	          fgetc(sortie);
            	          car++;
     
     
     
     
     
    //	    }
    //	else 
    //	    {
      //    }
     
    }
    fclose(sortie);  //fermeture fichier
    free (RBuff);
    }

    Alors je m'occupe de la fonction segmentation.
    Je télécharge un fichier en mode binaire et ensuite je dois le placer dans mon buffer ( RBuff) .
    La taille de mes segments à envoyer au récepteur est de 512. Donc je dois lire mon fichier cara ctère par caractère ( si c'est la bonne méthode) et les placer dans le RBuff juska atteindre 512.

    Ensuite, c'est la fonction send () qui, elle, envoie ces données.

    Mais franchement, je ne sais pas si c'est vraiment du char* car je ne pige pas grand chose en C.. :-(

  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 : 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 angy_y
    Je vais etre plus clair. voila mon code de la fonction segmentation
    #include <stdio.h>
    Alors commence par le commencement :

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    comment faut il faire now pour la fonction réassemblage dans le cas ou le client recoit des segments??

  11. #11
    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 angy_y
    comment faut il faire now pour la fonction réassemblage dans le cas ou le client recoit des segments??
    Pareil. Tu prévois un buffer de réception et tu écris dedans au fur et à mesure avec receive() et tu recopies sur le disque avec fwrite()...

    Aucune difficulté particulière. Les sockets et les fonctions fichiers, c'est fait pour.

Discussions similaires

  1. Réponses: 45
    Dernier message: 14/02/2008, 15h41
  2. insertion des données d'un fichier word dans une base de données
    Par pigeon015 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2007, 09h04
  3. Réponses: 6
    Dernier message: 08/12/2006, 13h07
  4. [XML] Integrer des données d'un fichier xml dans un autre ?
    Par vpet dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 16/03/2006, 18h41
  5. Réponses: 3
    Dernier message: 13/12/2004, 13h54

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