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 un fichier dans un buffer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut copier un fichier dans un buffer
    Bonjour a tous,

    J'aimerais savoir si il est possible d'ouvrir un fichier binaire et de copier son contenu dans un tableau de short par exemple.

    Ainsi chaque données de 16 bits du fichier seraient copiées dans une des cases de ce buffer...

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Tu peux surement utiliser fread() http://man.developpez.com/man3/fread.3.php

  3. #3
    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 Gruik
    Tu peux surement utiliser fread() http://man.developpez.com/man3/fread.3.php
    Indirectement. Si il s'agit de lire par bloc de 2 octets, il faut faire 2 accès (fgetc()) ou un accès de 2 bytes avec fread().

    Ensuite, il faut 'assembler' les 2 bytes en mémoire (|, <<) pour en faire un mot de 16 bits. Il faut connaitre le format de l'enregisrement (le standard 'réseau' est 'MSB en tête').

    Nota : Contrairement aux idées reçues, on a pas besoin de connaitre l'endianess de la cible.

  4. #4
    Invité
    Invité(e)
    Par défaut
    qu'entends tu par "chaque données 16 bits", tu veux mettre 2 chars a la fois dans un short, ou ton fichier a qqchose a voir avec UNICODE ?

    ce que je te propose, c'est de lire ton fichier dans un tableau de char, puis d'utiliser ceci pour passer des chars aus shorts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union USwitch {
        char  _pc[TAILLE_MAX];
        short _ps[TAILLE_MAX/2];
    };
    une fois que tu as créé ton buffer de chars, voici l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char* pcFile = /* le contenu de ton fichier */;
    size_t nFileSize = /* Nb d'octets du fichier */;
     
    USwitch u;
    memcpy(u._pc, pcFile, nFileSize);
     
    //tu utilises u_ps comme tu veux maintenant

  5. #5
    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 toxcct
    qu'entends tu par "chaque données 16 bits", tu veux mettre 2 chars a la fois dans un short, ou ton fichier a qqchose a voir avec UNICODE ?

    ce que je te propose, c'est de lire ton fichier dans un tableau de char, puis d'utiliser ceci pour passer des chars aus shorts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union USwitch {
        char  _pc[TAILLE_MAX];
        short _ps[TAILLE_MAX/2];
    };
    Pas portable. Probablement la pire des solutions...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas portable. Probablement la pire des solutions...
    depuis quand c'est pas portable ? je veux bien des explications, car je ne te suis pas du tout.
    union est défini dans le langage (donc portable). char est défini comme étant 1 octet, et short comme étant 2 octets.

    la seul chose qu'on fait ici est d'interpreter un table d'octets en tableau de groupes de 2 octets...

    donc OU est le probleme ?

  7. #7
    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 toxcct
    depuis quand c'est pas portable ?
    Depuis toujours !
    je veux bien des explications, car je ne te suis pas du tout.
    union est défini dans le langage
    Oui.
    (donc portable).
    Conclusion hative ! Standard ne signifie pas portable.
    char est défini comme étant 1 octet, et short comme étant 2 octets.
    Ben non. Un char a au moins 8 bits et un short a une plage d'au moins -32767 à 32767.
    la seul chose qu'on fait ici est d'interpreter un table d'octets en tableau de groupes de 2 octets...
    donc OU est le probleme ?
    L'endianess de la cible n'est pas forcément celle du fichier
    La taille d'un short n'est pas forcément celle de 2 bytes.

  8. #8
    Invité
    Invité(e)
    Par défaut
    je ne suis toujour pas d'accord, ,et encore une fois, tu ne donne guere d'avantage d'explication donc on n'avance pas beacoup...

    Conclusion hative ! Standard ne signifie pas portable.
    et c'est quoi portable ? puisque tous les compilateurs l'implémente, ou cela va t il planter ?

    Ben non. Un char a au moins 8 bits et un short a une plage d'au moins -32767 à 32767.
    et [-32767 ; 32767], ca ne tient pas dans 16 bits ?

    La taille d'un short n'est pas forcément celle de 2 bytes.
    pour moi, si le standard a dit, c'est dit... si quelqu'un implémente son propre compilateur et qu'il ne respecte pas ca, c'est son droit, mais c'est plus un compilateur C standard...

    L'endianess de la cible n'est pas forcément celle du fichier
    voici le seul point qui pourrait poser probleme... mais dans la mesure ou tout se passe sur la meme machine, sans échanges de mémoires, le stream est lu avec l'endianness de la cible

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/02/2006, 08h50
  2. Copier un fichier dans un répertoire
    Par soft damsel dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2006, 16h02
  3. Copier un fichier dans une chaine
    Par Fry dans le forum C++
    Réponses: 4
    Dernier message: 30/09/2005, 00h02
  4. [Système] Comment copier un fichier dans le presse papier ?
    Par le y@m's dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/09/2005, 12h03
  5. Réponses: 4
    Dernier message: 17/06/2005, 10h09

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