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 :

Récupération d'un double à partir d'un fichier binaire


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Récupération d'un double à partir d'un fichier binaire
    Bonjour,

    Je dois actuellement traiter un fichier binaire dont je connais juste la structure:
    entier, entier, double

    Après quelques recherches, j'ai trouvé la fonction strtod() qui devrait me permettre de transformer une chaine de caractères en double (sur la machine que j'utilise les double sont codés sur 8 octets).

    Voici le code que j'utilise pour lire le fichier. J'arrive très bien à lire les entiers, mais lorsque je souhaite "lire" le double, ca ne marche pas du tout.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    #include <string.h>
     
    void afficher(char*,int);
     
    int main() {
    	static FILE *ptr;
    	int ligne[1];
    	int colonne[1];
    	double flottant;
    	int temp;
    	char ligneFichier[8] = "        ";
    	char* carac;
    	char* cptr;
     
    	afficher(ligneFichier,8);
     
    	ptr = fopen("fichier.bin","rb");			
    if(ptr==NULL) 	exit(0);
    	temp = fread(ligne, sizeof(int),1,ptr);			
    if(temp<=0)	exit(0);
    	temp = fread(colonne, sizeof(int),1,ptr);			
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[0],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[1],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[2],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[3],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[4],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[5],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[6],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
          temp = fread(&ligneFichier[7],sizeof(char),1,ptr);	
    if(temp<=0)	exit(0);
     
    	afficher(ligneFichier,8);
    	flottant = strtod(ligneFichier,&cptr);
    	fclose(ptr);
    	printf("ligne=%d colonne=%d chaine=%s tailleChaine=%d double=%f\n ligne=%s\n",ligne[0],colonne[0],carac,sizeof(carac),flottant,ligneFichier);
    	return 0;
    }
     
    void afficher(char* chaine,int taille) {
            int i;
     
            for(i=0;i<taille;i++) {
                    printf("%d=< %c >\n",i,chaine[i]);
            }
    }
    J'ai aussi tenté de créer un "ligneFichier" avec un octet de plus pour rajouter le '\0' mais le résultat est le même. Je m'en remet donc à vos mains expertes

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il semble que tu confondes les deux écriture des nombres, d'après ce que tu écris, les deux premiers nombres sont écrits effectivement en binaire, mais le double est ecrit en format "texte".
    Je te propose plutôt ceci :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    #include <string.h>
     
    void afficher(char*,int);
     
    int main() {
    	static FILE *ptr;
    	int ligne[1];
    	int colonne[1];
    	double flottant;
    	int temp;
    	char ligneFichier[8] = "        ";
    	char* carac;
    	char* cptr;
     
    	afficher(ligneFichier,8);
     
    	ptr = fopen("fichier.bin","rb");			
    	if(ptr==NULL) 	
    		exit(0);
    	temp = fread(ligne, sizeof(int),1,ptr);			
    	if(temp<=0)	
    		exit(0);
    	temp = fread(colonne, sizeof(int),1,ptr);			
    	if(temp<=0)	
    		exit(0);
     
    	temp = fread(&flottantsizeof(flottant),1,ptr);			
    	if(temp<=0)	
    		exit(0);
    /*
          temp = fread(&ligneFichier[0],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[1],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[2],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[3],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[4],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[5],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[6],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
          temp = fread(&ligneFichier[7],sizeof(char),1,ptr);	
    	if(temp<=0)	
    		exit(0);
    	afficher(ligneFichier,8);
    */
    	flottant = strtod(ligneFichier,&cptr);
    	fclose(ptr);
    /*
    	printf("ligne=%d colonne=%d chaine=%s tailleChaine=%d double=%f\n ligne=%s\n",ligne[0],colonne[0],carac,sizeof(carac),flottant,ligneFichier);
    */
    	printf("ligne=%d colonne=%d double=%f\n ligne=%s\n",ligne[0],colonne[0],flottant,ligneFichier);
    	return 0;
    }
     
    void afficher(char* chaine,int taille) {
            int i;
     
            for(i=0;i<taille;i++) {
                    printf("%d=< %c >\n",i,chaine[i]);
            }
    }

  3. #3
    Membre averti Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Points : 442
    Points
    442
    Par défaut
    Il ne faut pas utiliser strtod car le double est déjà stocké en format binaire. strtod sera utile si la valeur était stockée en format chaine de caractères (dans ce cas j'utilise plutot sscanf ou directement fscanf).

    Il faut simplement lire les huit octets dans la variable flottant comme pour les deux entiers en utilisant fread

    Je propose le code suivant :
    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
     
    #include <stdio.h>
    int main()
    {
        FILE*fp;
        int ligne;
        int colonne;
        double flottant;
     
        fp = fopen("fichier.bin", "rb");
        if( fp !=NULL ) 
        {
            fread(&ligne, sizeof(ligne), 1, fp);
            fread(&colonne, sizeof(colonne), 1, fp);
            fread(&flottant, sizeof(flottant), 1, fp);
            fclose(fp);
     
            printf("Ligne=%d Colonne=%d Flottant=%lf\n", ligne, colonne, flottant);
        }
        return 1;
    }
    Encore deux remarques dans ton bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ligneFichier[8] = "        ";
    La chaine de 8 octets est initialisée avec une constante de 9 octets (8 char et le zéro final )

    Pour lire 8 octets dans un tableau de char il suffit de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(ligneFichier, sizeof(char), 8, ptr);
    puis de tester la valeur de retour qui sera le nombre d'éléments lus (ici des char)
    voir : MAN fread

    [-mod- Toujours utiliser les balises code, sinon, on ne voit pas les espaces multiples...]

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci! j'en viens maintenant à la précision suivante. Le fichier binaire a été généré sur une architecture x86 (little endian) et sa lecture sur une architecture G5 (big endian). C'est pour cela que je ne peux pas définir le type comme étant un double.

    Je suis donc obligé de faire une conversion:
    double(little endian) => binaire(little endian) => chaine de caractere => double (big endian)

    j'ai déjà créé une méthode qui permet de faire du byte swapping sur 8 octets, mon seul et dernier problème réside dans cette partie:

    Pour prendre le cas le plus simple (sans byte swapping), disons que l'endianness reste la même: il faut donc que j'arrive à faire la conversion suivante:

    binaire => chaine de caractere => double

    mais hélas je n'y arrive toujours pas
    J'ai déjà parcouru le forum et l'internet à cet effet mais je n'ai rien trouvé qui marche pour l'instant...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Je ne comprends pas pourquoi tu veux faire cette conversion !

    Quand tu ouvres un fichier en mode binaire (comme tu le fais) ce ne sont pas des chaînes de caractères que tu récupères, ce sont des 0 et des 1 !
    Et ces 0 et 1 représentent directement le nombre, donc il te suffit de récupérer 8 octets et de les stockées dans une variable de type double...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(&TonDouble, sizeof(double), 1, monFichier);
    Tout simplement...

    PS : je ne comprends l'intérêt de mettre ta variable FILE* en tant que variable static...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Lorsque tu utilises strtod celà signifie que ton nombre est écrit sous la forme 12,456 par exemple, ce qui n'est pas le cas, donc cette méthode binaire => chaine de caractere => double est fausse.
    Je ne peux malheureusement pas te répondre car je n'ai absolument aucune idée de l'écriture binaire des flottants en little et big endiannes.
    Il doit y avoir des documents qui traînent par-ci par-là mais lesquels ???

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    @Trap D: En big endian les octets sont écrits dans le sens inverse de small endian, si par exemple t'as le code : 14 F2 AB E8, en big endian ce sera : E8 AB F2 14...

    Le problème c'est de savoir sous quelle architecture le nombre a été enregistré...

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    @PsychoH13: cela ne marchera pas car un double little endian n'est pas un double big endian.

    Exemple: sachant que chaque lettre ici correspon a un octet

    (double little endian)
    A B C D E F G H

    =>

    (double big endian)
    H G F E D C B A

    si j'affiche le double que tu récupères dans ton exemple, j'aurais un chiffre complétement illisible. De plus, le byte swapping sur un type flottant n'est pas autorisé...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    @Mer.cury: si tu regardes mon message précédent c'est ce que je dis...

    Mais à part ça il est tout à fait possible de faire du bit swapping sur des double ou des float, il suffit d'utiliser un type union, genre de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union _swapper {
        float flottant;
        int entier;
    };
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union _swapper {
        double flottant;
        char tab[8];
    };
    Et à partir du membre entier ou tab tu fais ton swap, et tu récupères la valeur final via flottant.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mer.cury
    Je dois actuellement traiter un fichier binaire dont je connais juste la structure:
    entier, entier, double
    Ces informations sont insuffisantes. Il faut savoir :
    • Le format des entiers (largeur, boutisme)
    • Le format des flottants (largeur, boutisme, codage)

    Sans ces informations, le reste n'est que bricolage.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pascal.barbier
    Encore deux remarques dans ton bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ligneFichier[8] = "        ";
    La chaine de 8 octets est initialisée avec une constante de 9 octets (8 char et le zéro final )
    C'est faux. La définition indiquée est une erreur de syntaxe ("too many initializers"). Si ça compile, le comportement est indéterminé.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PsychoH13
    Je ne comprends pas pourquoi tu veux faire cette conversion !

    Quand tu ouvres un fichier en mode binaire (comme tu le fais) ce ne sont pas des chaînes de caractères que tu récupères, ce sont des 0 et des 1 !
    Et ces 0 et 1 représentent directement le nombre, donc il te suffit de récupérer 8 octets et de les stockées dans une variable de type double...
    Ben non. Les données ont été codées en binaire selon un format totalement différent (Power PC). La bonne manip, pour être portable aurait été de coder en texte, ("%g"), mais c'est trop tard. On est obligé de se taper une conversion bit à bit si on a le format de la source et de la destination...

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PsychoH13
    @Trap D: En big endian les octets sont écrits dans le sens inverse de small endian, si par exemple t'as le code : 14 F2 AB E8, en big endian ce sera : E8 AB F2 14...

    Le problème c'est de savoir sous quelle architecture le nombre a été enregistré...
    Ca a été dit : Power PC (G5), soit big endian avec int = long = 4 octets. Le problème est simple pour les entiers : 4 octets à swapper, c'est facile.

    Pour les flottants, sans doc de part et d'autre, on ne peut rien faire.

    De toutes façons, ça ne sera pas portable à moins de faire une conversion Power PC -> chaine directement (c'est pas gagné...)

    P.S. c'est pas 'small', mais 'little'...

  14. #14
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé de faire quelque chose avec les unions, sans succès:

    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
     
    typedef union _swapper_double sdouble;
    union _swapper_double {
    	double flottant;
    	char tab[8];
    };
    ...
    sdouble flottant;
    ...
    temp = fread(&flottant, sizeof(sdouble),1,ptr);          if(temp<=0)     exit(0);
    ...
    c[0] = flottant.tab[0]; 
    flottant.tab[0] = flottant.tab[7]; 
    flottant.tab[7] = c[0];
    c[0] = flottant.tab[1]; 
    flottant.tab[1] = flottant.tab[6]; 
    flottant.tab[6] = c[0];
    c[0] = flottant.tab[2]; 
    flottant.tab[2] = flottant.tab[5]; 
    flottant.tab[5] = c[0];
    c[0] = flottant.tab[3]; 
    flottant.tab[3] = flottant.tab[4]; 
    flottant.tab[4] = c[0];
    Ci dessus donc, le code qui ne marche pas.


    Voici des informations complémentaires (sur les flottants car il n'y a que ce type qui m'interesse):

    dans le fichier binaire:
    double:
    8 octets
    norme IEEE
    little endian
    lisible depuis un Genuine Intel 2ghz Dual core

    sur la machine qui doit lire ce fichier binaire:
    double:
    8 octets
    norme IEEE
    big endian
    lisible depuis un PowerPC G5

    J'ai l'impression que la réponse est toute simple et pourtant je n'y arrive pas

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Alors déjà pour ton swapper, voilà une petite 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
    typedef union swapDouble_tag {
        double flottant;
        char tab[8];
    } sdouble;
     
    double swapDouble(double f)
    {
        sdouble res, temp;
        temp.flottant = f;
        int i;
        for(i = 0; i < 8; i++)
            res.tab[i] = temp.tab[7 - i];
     
        return res.flottant;
    }
    Cette fonction inverse donc chaque octet et retourne le double correspondant. Il suffit donc de lui fournir un double, que ce soit little endian ou big endian, et il te retourna la version opposée.

    Sinon, si la circulation des données se fait toujours dans le même sens, c'est-à-dire : écriture sur Intel et lecture sur PPC, alors la fonction suffit et tu peux faire tes enregistrements normalement. Si la circulation peut se faire dans les deux sens, je te conseille d'ajouter dans ton fichier, un booléen indiquant dans quel format (little ou big endian) le double est enregistré pour éviter tout problème.

  16. #16
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    j'ai du mal à voir la différence entre le résultat que donne ton code et celui que j'ai posté juste au dessus, pourrais tu m'éclairer sur ce point s'il te plait?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Déjà ton c[0]... j'aimerais bien savoir d'où ça vient ! Et aussi j'aimerais comprendre l'intérêt de faire un tableau dont tu n'utilises qu'une seule case. Ma fonction est un peu plus propre. Et surtout elle est séparée du reste du code donc réutilisable facilement.
    Donc certe il n'y a pas de grande différence mais ça marche... Et aussi je pense que dans le fread() il aurait fallu mettre &flottant.flottant plutôt que &flottant tout seul...

  18. #18
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    ca ne marche pas...

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Tu veux bien être plus précis ?

  20. #20
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    ca ne m'affiche pas le bon nombre sur le powerpc, dixit le code que j'avais montré plus haut et qui lui aussi ne marchait pas.

    (j'ai un 0.00000 à l'affichage au lieu d'un -30.00000)

Discussions similaires

  1. Récupération de valeurs a partir d'un fichier texte
    Par D_light dans le forum Shell et commandes POSIX
    Réponses: 4
    Dernier message: 08/11/2012, 14h56
  2. [fstream]Lecture d'un double à partir d'un fichier
    Par yo_haha dans le forum Débuter
    Réponses: 8
    Dernier message: 12/01/2011, 10h57
  3. Réponses: 10
    Dernier message: 07/12/2009, 17h00
  4. Réponses: 2
    Dernier message: 22/05/2009, 15h06
  5. Récupération automatique d'images à partir d'un fichier vidéo
    Par osscour dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 15/05/2006, 09h11

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