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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    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
    Par défaut
    Tu as essayé fgetc ?
    "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

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

    Informations professionnelles :
    Activité : Étudiant

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

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    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
    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
    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 chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    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
    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
    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 :

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