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 :

Problème lecture de fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Problème lecture de fichier
    Bonjour,

    J'ai un souci avec la lecture de structure variable en langage c.

    Je m'explique, je dois lire un fichier .xxxx, pour cela je dois lire les structures du header d'abord. Ceci se fait tres facilement en C à l'aide de typedef struct puis fread(&struct_blabla,sizeof(struct_blabla),1,file);

    Mais pour lire ce fichier .xxxx je dois lire apres les structures header une structure de taille variable c'est a dire qui contient un nombre de caractere aleatoire (commentaires qui varient d'un fichier .xxxx à l'autre). Et je ne vois pas encore comment faire pour le faire en C. Je ne connais pas le nombre de caractères de commentaires mais je sais que la prochaine variable de cette structure doit avoir une certaine valeur.

    J'ai déjà écrit cette structure en Matlab (j'ai deja fait la fonction sur Matlab pour lire les .xxxx donc je sais que ca fonctionne correctement), si ça peut vous aider à comprendre ce que je cherche à faire.


    Code Matlab : 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
    function [BlockSize,Type2]= get_TaggedBlocks(open,OffSetup,Length,OffImageOffsets)
     
    if (hex2dec(OffSetup)+Length)<hex2dec(OffImageOffsets)
     
     
        A=fread(open,1,'uint16');
        B=[A];
        cmpt=2;
        while A~=1002
            A=fread(open,1,'uint16');
            B=[B,A];
            cmpt=cmpt+2;
        end
        % BlockSize
         BlockSize=B((cmpt-4)/2)
        % Type
        Type2=dec2hex(A)
        % Reserved
        Reserved=fread(open,1,'uint16')
        C=BlockSize-8;
        if BlockSize<8
            C=1;
        end
        % Data
        Data(1:C)=fread(open,C,'uint8');
    end
    end

    J'ai déjà cherché du côté de la lecture ligne par ligne et des listes chainées mais sans succès pour l'instant.

    Si vous aviez une idée ça m'aiderait beaucoup. Merci d'avance. Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je suppose, j'espère, que la "certaine valeur" ne peut pas apparaître dans le commentaire?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je suppose, j'espère, que la "certaine valeur" ne peut pas apparaître dans le commentaire?
    Non la certaine valeur ne peut pas apparaitre dans le commentaire.

    Tout ce qui est avant les commentaires est fixe et lu dans des structures, puis voici ma structure aléatoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char Description[taille aléatoire]; ( char*)
    uint32_t BlockSize;
    uint16_t Type;  //et je sais que Type vaut toujours 1002 ou en en hexa "3EA"
    uint16_t Reserved; 
    uint8_t Data[BlockSize-8];
    Apres ce que je fais sur Matlab c'est de lire toutes les lignes jusqu' à obtenir la valeur Type, puis retranché le nombre de bytes pour avoir la valeur de BlockSize. Ce qui se trouve dans Description ne m'intéresse absolument pas.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Je dois avouer que j'avais pensé à utiliser la meme idée que sur Matlab, à savoir: lire le fichier ligne par ligne jusqu'à avoir les caractères "Ω♥" qui correspondent à 1002.

    Doc j'ai créé cette fonction:

    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
    void Read_line_by_line(FILE* fp)
    	{
    		int cmpt;
    		char A[2];
    		cmpt=0;
    		if ( fp != NULL )
                   {
    			while (fgets (A, 2, fp)!="Ω♥") 
    			{
    				cmpt=cmpt+2;
    			}
    			printf("Position: %d\n",cmpt);
    		}
    		else
    		{
    			printf("Error");
     
    		}
    	}
    L'idée est qu'ainsi je connais la position, ou plutot le nombre de bits nécessaires pour définir après la taille de mes commentaires.
    Mais cette boucle tourne à l'infini, je ne comprends pas ce qui cloche. Et surtout est)ce une bonne idée de vouloir résoudre mon problème de cette facon?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Lis plutôt short par short, comme le code Matlab que tu as posté semble le faire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Lis plutôt short par short, comme le code Matlab que tu as posté semble le faire.
    Euh je voudrais bien le faire, je suis passé par fgets car je ne connais pas la fonction en C qui lis les lignes short par short et même en cherchant un peu je ne vois pas. En existe-t-il une ou je dois la créer (je vois pas trop comment faire pour le moment)?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Comme dans matlab, une boucle avec la fonction de lecture normale, pour deux octets.
    En clair, une boucle de fread() avec taille 2 et quantité 1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Comme dans matlab, une boucle avec la fonction de lecture normale, pour deux octets.
    En clair, une boucle de fread() avec taille 2 et quantité 1.
    Un peu déçu que ça soit si facile. Désolé pour les questions bêtes alors.

    Néanmoins voilà ce que j'ai fait pour ma fonction, mais j'ai toujours une boucle infini, ce qui veut dire qu'il n'arrive pas à trouver cette valeur. Or je sais à qu'elle position elle se trouve pour ce fichier, grâce à ma fonction MATLAB. et quand je lui écrit : printf("Type %d\n",info_tag.Type); apres avoir definit une structure fixe (voir la partie commentée) en connaissant exactement le nombre de commentaires (via MATLAB), le printf me donne la valeur 1002. .
    Je vois pas ce qui cloche, une idée?

    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
    int main()
    {
            CINEFILEHEADER cine_file_header;
            BITMAPINFOHEADER info_bitmap_header;
            SETUP info_setup;
    	int comments[10000];
    	int re;
    	int cmpt;
    	FILE * fp;
    	fp=fopen("C:\\Desktop\\20140327_DFI15_EMBR00002D_11012021_68881_60barsBP_1_3ms_0800barRP_06.cine","rb");
    	if (fp == NULL)
    	{
    		printf("erreur lecture" );
    		exit(1);
    	}
    	fread(&cine_file_header, sizeof(cine_file_header), 1, fp);
     
    	fread(&info_bitmap_header, sizeof(info_bitmap_header), 1, fp);
     
    	fread(&info_setup,sizeof(info_setup),1,fp);
     
    	cmpt=0;
    	re=fread(&comments,2,1,fp);
    	while(re!=1002)
    	{
    		re=fread(&comments,2,1,fp);
    		cmpt=cmpt+2;
    	}
    	printf("Position %d\n",cmpt);
     
    	fclose(fp);
     
            return(0);
    }
     
     
     
    /*typedef struct tagTypeBlocks
    	{
    		uint8_t A[8520];
                    uint16_t Type;
            }
    */

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Au temps pour moi j'ai écrit n'importe quoi dans le message d'avant. En lisant correctement cette fois ci ligne par ligne j'arrive au résultat voulu. Merci pour l'aide et désolé du dérangement.

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

Discussions similaires

  1. [NASM] Petits problèmes lecture de fichier
    Par Jaronimo dans le forum Assembleur
    Réponses: 1
    Dernier message: 01/05/2008, 14h56
  2. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57
  3. Problème lecture gros fichier texte
    Par UnnamedBoy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/02/2008, 11h13
  4. problème lecture seule fichier image
    Par Damien69 dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2007, 16h53
  5. problème lecture de fichier
    Par nico33410 dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2006, 20h01

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