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

  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 397
    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 397
    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
    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 m'exprime si mal que ça?

    J'y ai pensé! mais ce n'est pas ça que je veux ! char = caractère...moi je veux pouvoir effectuer des transformées de fourrier et autres sur mes signaux entrant(ils entrent sous forme de séquences binaires).

    c'est tout simple pourtant on me donne une séquence : 11010010 je veux la stocker en entier soit dans une variable soit dans un tableau ou structure ou autre pour qu'elle reste sous la forme 11010010 et que je puisse y accéder facilement

  8. #8
    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.

  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 DelilahHinxs Voir le message
    c'est tout simple pourtant on me donne une séquence : 11010010 je veux la stocker en entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int n = strtol("11010010", NULL, 2);

  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
    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?

  11. #11
    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...

  12. #12
    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

  13. #13
    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...

  14. #14
    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...

  15. #15
    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

  16. #16
    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...

  17. #17
    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
    c'est juste un fichier test type...

    donc peu importe si je gagne de la place

    mais c'est une suggestion que je note!

    Maintenant on peut travailler sur ma fonction read_bits_seq?

    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;
    char sequence[8];
    /* Lecture */
    while(i<x_bits)
    {
    sequence[i]=fgetc(dat);
    }
    seq=strtol(/* Comment mettre les séquence ici à partir du tableau ou à partir d'une variable? */, NULL, 2);
    return seq;
    }

  18. #18
    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
    Ce que je vois moi c'est une boucle infinie tout simplement parce que i ne change pas... Ce que je voudrais savoir c'est pourquoi avoir fait un tableau de séquence ? Constant qui plus est, ce qui t'enlève la possibilité de le modifier...
    Ce que je voudrais aussi avoir c'est pourquoi la taille de ton tableau est de 7 alors que tu souhaites récupérer des séquence de 8 bits, et aussi je voudrais savoir pour tu utilises plusieurs cases alors qu'un seul char serait suffisant...
    je voudrais aussi savoir pourquoi tu passes un simple caractère à la fonction strtol() alors qu'elle demande une chaîne...
    Et aussi pourquoi tu fais un tableau de chaîne de caractères alors que, même si ton code marchait, tu n'utilises qu'une ligne et que tu n'alloues rien...

    En clair, tu as codé avec tes pieds et tu n'as fait attention à rien...

  19. #19
    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
    Du calme pas besoin de devenir agressif!

    Si je suis venue ici c'est pour avoir un peu d'aide pour faire avancer! J'ai poster dans la catégorie débutante aussi...!

    Je sais bien qu'il y a des erreurs je l'ai signalé précédemment...

    En faite je ne comprend pas comment utiliser ma fonction pour lire les séquences de x_bits(donné en argument) et avec strtol les mettre en séquence et les stockée dans un long int...je pense que c'est ca que fait la fonction!

    PS: si c'est pour être agressif...ce n'est pas la peine de répondre...franchement

  20. #20
    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
    Le problème là c'est qu'il faut revoir les bases.
    Pour commencer, strtol() demande qu'on lui passe en paramètre une chaîne de caractères C, c'est-à-dire une suite de caractères terminée par le caractère NUL, c'est-à-dire '\0' (ou en entier 0).

    Là, si tu souhaites lire 8 bits par 8 bits, ton tableau sera trop petit,, parce qu'il faut les 8 caractères pour chaque bits, et un 9ème pour contenir le 0 de fin de chaîne. Lorsqu'on déclare un tableau, la valeur mise entre crochet c'est le nombre de cases que va contenir le tableau. À ne pas confondre avec l'indice de celles-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char monTableau[N] = {0};
    Ici pour ce tableau on aura N cases dont les indices iront de 0 à N-1.

    Ensuite, la première chose qu'il faut définir dans une boucle c'est sa condition de sortie. Ici, tu définis une condition de sortie mais elle n'est jamais atteinte. Pourquoi ? Parce qu'elle dépend de i et que i ne change pas.
    Donc ta boucle sera infinie, et chaque valeur lue par fgetc() écrasera celle précédemment lu.
    Il te faut donc ajouter un i++ à la fin de ta boucle.

    Mais il n'y a pas que ça comme problème dans ta boucle. La condition de sortie se base sur le nombre de bits à lire passé en paramètre...
    Mais si le xbits est plus grand que le nombre de cases de ton tableau alors la boucle s'amusera au bout d'un moment à écrire au-delà de la mémoire qui lui est alloué, ce qui au bout d'un moment plantera le programme.

    De plus, si tu dois lire plus de valeurs que le nombre de caractères disponible dans le fichier, là aussi ça posera problème, tu ne vérifies pas que tu as atteint la fin du fichier.

    Il faut donc que tu revois ta fonction complètement.

    PS : excuse-moi si j'ai semblé agressif.

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