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 :

open, binaire et texte


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut open, binaire et texte
    J'ai un fichier que je cherche à lire, fichier que j'ouvre avec open.

    Je porte du code de Linux vers Windows, j'ai bien vérifié que la version originale (Linux) fonctionnait.

    Sous windows, j'utilise MinGW, et là j'ai un problème.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        fd = open(Ir_File, O_RDONLY|O_BINARY);
        if (read(fd, &head, sizeof(IR_Header)) != sizeof(IR_Header))
            return 1;
        if (read(fd, &metatable, NUM_OF_TABLES * sizeof(MetaTable_t)) !=  NUM_OF_TABLES * sizeof(MetaTable_t)) 
            return 2;

    J'ouvrais d'abord mon fichier sans l'option O_BINARY, la rajouter n'a rien changé au problème.

    A l'exécution sous Windows, le premier if passe, mais pas le second. A l'exécution sous Linux, les deux passent.
    Il semblerait que ça soit un problème lié au charactère EOF, que l'ajout de l'option O_BINARY aurait dû résoudre. Et donc je ne sais pas quoi faire d'autre

    Je ne pense pas que ça soit en cause, mais l'ouverture et la lecture du fichier ne se font pas dans le même fichier source (je passe le file descriptor en paramètre d'une fonction).

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ce code n'est pas portable : tu copies à la volée X octets d'un fichier vers une zone mémoire correspondant à un objet structure. Il y a, quoi qu'il arrive, des problèmes possibles liés à l'alignement, à la taille des types et à l'endianess.

  3. #3
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Alignement ?

    Pour les types et l'endianess, c'est géré (en fait je lis un fichier que je génère dans le même projet, bref c'est prévu). C'est juste le mot alignement pour lequel je ne sais pas de quoi tu parles.

  4. #4
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Bon, j'ai effectivement un problème (snif), et je ne sais pas à quoi il est lié.


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IR_Header head;
    MetaTable_t metatable[NUM_OF_TABLES];
    ConstTable_t *consttable;
     
        if (read(fd, &head, sizeof(IR_Header)) != sizeof(IR_Header))
            return 1;
        if (read(fd, &metatable, NUM_OF_TABLES * sizeof(MetaTable_t)) !=  NUM_OF_TABLES * sizeof(MetaTable_t)) 
            return 2;
        consttable = (ConstTable_t *) calloc(metatable[CONST_TABLE].total_records, sizeof(ConstTable_t));
        if (read(fd, consttable, metatable[CONST_TABLE].table_size) != metatable[CONST_TABLE].table_size) 
            return 3;
    pour head et metatable tout va bien, mais pour consttable c'est mort, mes résultats ne sont plus bons. Il lit bien (pas de return3), mais quand je tente de récupérer les infos, je n'ai pas tout.

    Sachant qu'ils sont déclarés comme ça :

    Code C : 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
    typedef struct {
    	uint8 magic[4];
    	uint8 endian;
    } IR_Header;
     
    typedef struct {
    	uint8 table_name[32];
    	uint32 table_size;
    	uint32 table_offset;
    	uint32 total_records;
    	uint32 record_size;
    } MetaTable_t;
     
    typedef struct {
    	uint32 id_name;
    	uint8 val_type;
    	int32 value;
    } ConstTable_t;

    Quand je relis, j'obtiens ça (suivi d'un Segmentation Fault) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Consttable
    id_name : .-1},%d{1.-1}
    val_type : CONST_TABLE_STRING_TYPE
    val_val : "%d{1.-1}"
    id_name : .-1}
    val_type : CONST_TABLE_STRING_TYPE
    val_val : "1%3b{0.-1}0000000%4b{1.-1}000100001101"
    id_name : 0000000%4b{1.-1}000100001101
    val_type : CONST_TABLE_STRING_TYPE
    J'ai 11 structures utilisant calloc, qui foirent toutes (mais je vais pas tout mettre, je suppose que le problème est commun à toutes, vu qu'elles sont déclarées pareil).

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    si size(uint8) = 1 et que sizeof(uint32) = 4 (sur les 2 OS, vérifié les valeur de sizeof sur les 2 OS ?).
    Je dirais que dans ConstTable a un vilain padding en plein milieu.
    Windows et Linux peuvent le gérer différemment.

    Je ne comprends pas ton résultat, comment doit-on interpréter val_val et id_name ?

  6. #6
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Je suis sensé avoir ça (résultat que j'ai avec un fichier, mais que je n'arrive pas à générer correctement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Consttable
    id_name : proc
    val_type : CONST_TABLE_STRING_TYPE
    val_val : "ppc"
    id_name : bit_order
    val_type : CONST_TABLE_STRING_TYPE
    val_val : "uppermost"
    id_name : M_is_little
    val_type : CONST_TABLE_STRING_TYPE

Discussions similaires

  1. Comment connaître par le code si un fichier est binaire ou texte
    Par teuzadur dans le forum Bibliothèque standard
    Réponses: 7
    Dernier message: 25/06/2008, 18h21
  2. Lire le format d'images PPM : de la lecture binaire ou texte des fichiers
    Par cladsam dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 08/05/2007, 12h35
  3. Détecter si un fichier est binaire ou texte?
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/10/2006, 08h13
  4. fichier binaire ou texte , que choisir ?
    Par Djob dans le forum C++
    Réponses: 4
    Dernier message: 19/12/2005, 16h21
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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