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 :

Stockage séquence C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut Stockage séquence C
    Bonjour à tous,

    J'ai un problème en C, j'ai dans un fichier des séquences de 8 bits (11100010 par exemple) et j'aimerais les stocker, dans une variables, un tableaux,...mais que toute ma séquence soit en entière dans une variable ou un tableau car je dois m'en servir plus loin...j'ai essayé des structure mais ça ne marche pas des masses!

    Merci à vous d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Qu'appelles-tu exactement "séquences de bits" ?
    C'est sous quelle forme ?
    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
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    11010100 sous cette forme ci et j'ai à peu près 1000 - 10 000 séquences comme ca qui se suivent dans un fichier...

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    L'information traitée au niveau de l'ordinateur est codée en binaire. Un fichier est une collection d'informations (codées en bianire). La fonction fread permet de charger en mémoire le contenu d'un fichier qu'on a préalablement ouvert en lecture.

    Si tes "séquences de bits" sont du texte (par exemple une suite des caractères: '1', '1', '1', '0', '0', '0', '1', '0') et non des données brutes, utilise les fonctions de lecture de caractères (par exemple fgetc) et range les caractères lus dans un tableau de caractères assez large pour contenir une "séquence de 8 bits" (c'est-à-dire un tableau pouvant au moins contenir 9 caractères, un pour le caractère de fin de chaîne '\0').

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Je crois que je me suis mal exprimée, tout ce qui est lecture de fichier est déjà fait, le problème c'est après les avoir lu je voudrais les stocker par séquences de 8 bits ou n bits...en fonction de mon choix, ce sont des données réelles elles représentent quelque chose quand elles sont par séquence de n bits...donc il me faudrait une structure ou autre pour les stocker et pouvoir travailler avec:

    struct stockage_bits
    {
    unsigned int bit[7];
    };

    voilà ce à quoi j'avais pensée mais le problème c'est que ca stocke bit par bit et moi je voudrais stocker une séquence(11010101 par exemple) entièrement...pas par bits...

    Je ne peux pas traiter ces séquences comme des caractère car je dois travailler avec par après et effectuer diverses opérations dessus

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Tu n'as qu'à utiliser les types de bases...
    Un char par exemple stocke au moins 8 bits, un short au moins 16, pourquoi tu n'utilises pas directement ça ? Au lieu de prendre un tableau, et ensuite si tu veux pouvoir accéder à chaque bits, il faut utiliser des masques.

  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 DelilahHinxs Voir le message
    J'ai un problème en C, j'ai dans un fichier des séquences de 8 bits (11100010 par exemple) et j'aimerais les stocker, dans une variables, un tableaux,...mais que toute ma séquence soit en entière dans une variable ou un tableau car je dois m'en servir plus loin...j'ai essayé des structure mais ça ne marche pas des masses!
    C'est pas très clair. Toute donnée unitaire d'un fichier est une séquence 8 bits... Ou alors s'agit-il d'une séquence de 8 octets valant 0 ou 1 ou encore '0' ou '1' ? Bref, il faut être plus précis.

    Ensuite tu veux les stocker dans quoi ? Pour en faire quoi ?

    Ce qui aiderait, c'est de connaitre la signification de ces bits, la nature des données à traiter, voire, le traitement attendu... Bref, commencer par le début, c'est à dire une définition de l'interface et du comportement attendu.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Alors,

    Je dispose d'un fichier data_in.data voici son contenu :

    10101010001010100101111111010101101010101011010101010101

    J'ai créer une fonctions qui compte le nombre de caractère dans ce fichier, ce nombre est divisé par exemple par 8 pour donné une séquence on a donc un découpage par séquence de 8 bits:

    10101010 10001111 etc

    C'est là que je coince je veux stocker ceci : 10101010 dans quelque chose qui me permette de travailler directement par séquence

    Merci je vais tester ca unsigned int n = strtol("11010010", NULL, 2);
    et si je lis les séquence dans le fichier comment puis je utiliser strtol pour que ce qu'il y a entre "" soit lu dans le fichier?

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Déjà, il faut savoir que c'est pas parce que le type s'appelle "char" pour "caractère" qu'on y stocke forcément que des caractères. Un char n'est pas plus qu'un entier interprété comme un caractère et qui est codé sur 8 bits.
    D'ailleurs à l'origine en C, on utilisait les char pour faire des chaînes de caractères terminées par un '\0' mais aussi pour une suite d'octets ne correspondant pas à des caractères.
    Si ça te perturbe tant que ça de parler de char, tu n'as qu'à écrire ça au début de ton code :

    Et d'utiliser "byte" pour stocker tes 8 bits.

    Ensuite, si ton fichier de données contient réellement une suite de caractères '0' et '1' (c'est-à-dire que chaque 0 et 1 prennent en fait chacun 8 bits dans le fichier)... Alors tu peux lire chaque caractère un par un et les convertir en valeur binaire pour les stocker dans tes "byte".

    Si en revanche il s'agit bien d'un fichier binaire et que tes 0 et 1 sont bels et biens qu'un seul bit et non pas 8 bits sous le capot, alors il te suffit de lire l'équivalent de 8 bits, c'est-à-dire ton type "byte" dans ton fichier en utilisant la fonction fread() et en utilisant un FILE ouvert sous forme de fichier binaire...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Voici la fonction que j'essaye de mettre au pointil y a des erreurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    unsigned int read_bits_sequence(FILE* dat,unsigned int x_bits)
    {
    	/* Variables */
    	unsigned int i=0,seq;
    	const char *sequence[7];
    	/* Lecture */
    	while(i<x_bits)
    	{
    		sequence[i]=fgetc(dat);
    	}
    	seq=strtol(sequence[i], NULL, 2);
        return seq;
    }
    Je voudrais que cette fonction lise des séquence 1001001 ou plus longue taille: x_bits et qu'ils me stockent ca alors dans un unsigned int comme dit au dessus avec strtol

  11. #11
    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 DelilahHinxs Voir le message
    Voici la fonction que j'essaye de mettre au point
    C'est pas la peine d'écrire une ligne code, tant qu'on ne sait pas exactement ce qu'il y a à faire. On attend une définition précise du fichier...

  12. #12
    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 DelilahHinxs Voir le message
    Je dispose d'un fichier data_in.data voici son contenu :
    10101010001010100101111111010101101010101011010101010101
    C'est un fichier texte ou binaire ?

    Si on le regarde avec un éditeur hexa, on voit :

    ou
    ou
    ?

    Tu peux poster un lien vers ce fichier ?
    Merci je vais tester ca unsigned int n = strtol("11010010", NULL, 2);
    et si je lis les séquence dans le fichier comment puis je utiliser strtol pour que ce qu'il y a entre "" soit lu dans le fichier?
    Ca dépend de ce qu'il y a dans le fichier...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    C'est ca que j'ai avec hexedit...je poste un lien vers mon fichier de suite
    Fichiers attachés Fichiers attachés

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Si c'est toi qui a créé le fichier en question, laisse-moi te dire que c'est pas parce que tu utilises des 0 et des 1 que tu économises de la place, bien au contraire...

  15. #15
    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 DelilahHinxs Voir le message
    C'est ca que j'ai avec hexedit...je poste un lien vers mon fichier de suite
    OK. C'est donc un fichier de caractères '0' ou '1. Il n'est pas organisé en lignes, mais en une seule séquence. La longueur de 165 caractères (non multiple de 8) est fixe ou elle peut être plus grande ?

    Voila un exemple qui extrait les caractères, les transforme en valeurs numériques et les stocke par groupe de 8 bits dans un tableau. Je considère que le MSB est en tête. Ensuite, je fais un affichage en hexadécimal :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #include <stdio.h>
     
    /* 0 | 1 */
    #define DBG 0
     
    #define FNAME "data_in.txt"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "r");
       if (fp != NULL)
       {
          unsigned char tab[(165 / 8) + 1];
          size_t i_bit = 0;
          size_t i_oct = 0;
          unsigned oct = 0;
          int c;
     
          while ((c = fgetc (fp)) != EOF && i_oct < sizeof tab)
          {
             unsigned bit = c - '0';
    #if DBG
             printf ("%u:", bit);
    #endif
             oct |= (bit << i_bit);
     
    #if DBG
             printf (" %02X\n", oct);
    #endif
     
             i_bit++;
             if (i_bit == 8)
             {
                i_bit = 0;
                tab[i_oct] = oct;
                i_oct++;
                oct = 0;
    #if DBG
                printf ("\n");
    #endif
             }
          }
    #if DBG
          printf ("\n");
          printf ("\ni_bit = %u\n", i_bit);
          printf ("\ni_oct = %u\n", i_oct);
    #endif
     
          {
             size_t i;
             for (i = 0; i < sizeof tab; i++)
             {
                printf ("%02X ", tab[i]);
             }
             printf ("\n");
          }
       }
       else
       {
          perror (FNAME);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    55 54 FA AB 55 AD AA 55 55 A5 AA AA 4C 55 69 55 55 55 55 D5 10
     
    Press ENTER to continue.

Discussions similaires

  1. Stockage de paramètres unitaires
    Par ovh dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 07/10/2003, 09h07
  2. [Kylix] stockage d'un tableau d'octets dans interbase
    Par georges1001 dans le forum EDI
    Réponses: 1
    Dernier message: 16/09/2003, 14h14
  3. gain stockage olap
    Par colomban dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/05/2003, 15h24
  4. [Stockage] Image dans un fichier XML
    Par ovh dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/04/2003, 16h21
  5. Extraire une séquence d'un fichier MPEG
    Par enzosp dans le forum DirectX
    Réponses: 2
    Dernier message: 24/02/2003, 11h30

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