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 :

[Manipulation fichier] Probleme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut [Manipulation fichier] Probleme
    Bonsoir a tous,

    J'essayais de recoder plus ou moins la source
    que j'ai vu dans la rubrique "Source" de la section "C".
    ( )

    ...un programme qui permet de transformer une image
    au format bmp en son negatif.

    (Je suis sur windows avec Code::Block)
    Mais j'avais un probleme lorsque j'ecrivais dans le fichier.
    (dans la fonction "negatif"). Puis apres quelques modifications
    plus ou moins hasardeuses le programme s'est mis a fonctionner.

    Mon probleme c'est que je ne comprends pas pourquoi il fonctionne.
    Donc si quelqu'un pouvait m'expliquer pourquoi mon premier code
    ne marche pas et pourquoi le second fonctionne.

    Voila le code auquel j'etait arrive mais qui ne marchait pas:

    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
     
    void    negatif(t_infos *infos)
    {
        int odepth;
        unsigned char temp[4];
        int nbpix;
        FILE *fp;
        int i;
     
        fp = infos->fp;
        odepth = infos->depth / 8; // Nombre d'octets par pixel.
        nbpix = infos->width * infos->height;
     
        for (i = 0; i < nbpix; i++)
        {
            fread(temp, sizeof(temp[0]), odepth, fp); // je lis odepth octet(s).
            temp[0] = OMAX - temp[0]; // j'effectue l'operation pour passer
            temp[1] = OMAX - temp[1]; // en negatif. (si je suis sur une image
            temp[2] = OMAX - temp[2]; // en 8 bits alors temp[1-2-3] ne me servent
            temp[3] = OMAX - temp[3]; // a rien. (Maximum 32 bits).
            fseek(fp, -odepth, SEEK_CUR); // je me repositionne.
            fwrite(temp, sizeof(temp[0]), odepth, fp); // j'ecris mon/mes octet(s) (odepth).
        }
    }
    Fonction negatif qui fonctionne (sans que je comprenne):
    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
     
    void    negatif(t_infos *infos)
    {
        int odepth;
        unsigned char temp[4];
        int nbpix;
        FILE *fp;
        int i;
     
        fp = infos->fp;
        odepth = infos->depth / 8; // Nombre d'octets par pixel.
        nbpix = infos->width * infos->height;
     
    /* Je met ce fseek a cause du premier fseek de la boucle suivante. */
        fseek(fp, odepth, SEEK_CUR);
     
        for (i = 0; i < nbpix; i++)
        {
            fseek(fp, -odepth, SEEK_CUR); // ------------------------------ <<
            fread(temp, sizeof(temp[0]), odepth, fp);
            temp[0] = OMAX - temp[0];
            temp[1] = OMAX - temp[1];
            temp[2] = OMAX - temp[2];
            temp[3] = OMAX - temp[3];
            fseek(fp, -odepth, SEEK_CUR);
            fwrite(temp, sizeof(temp[0]), odepth, fp);
            fseek(fp, odepth, SEEK_CUR);
        }
    }
    Reste du code:
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define HEADER_FILE_SIZE 14
    #define OMAX 255
     
    typedef struct infos
    {
        FILE *fp;
        char sign[2];
        int filesize;
        int offset;
        int headsize;
        int width;
        int height;
        int depth;
        int compress;
        char buff[3];
    }               t_infos;
     
    int main()
    {
        t_infos infos;
     
     
        infos.fp = fopen("test.bmp", "r+b");
     
        get_header(&infos);
     
        printf("\nTraitement en cours...\n");
        negatif(&infos);
        printf("Traitement termine.\n");
     
        fclose(infos.fp);
        getchar();
        return (0);
    }
     
    void    get_header(t_infos *infos)
    {
        unsigned char temp[HEADER_FILE_SIZE];
        unsigned char *tmp;
     
    /* Recuperation du header du ficher. */
     
        fread(temp, sizeof(temp[0]), HEADER_FILE_SIZE, infos->fp);
        infos->sign[0] = temp[0];
        infos->sign[1] = temp[1];
        infos->filesize = temp[2] + (temp[3] * 256) + (temp[4] * 256 * 256);
        infos->offset = temp[10] + (temp[11] * 256);
     
    /* Recuperation du header de l'image. */
     
        tmp = malloc(sizeof(*tmp) * infos->offset);
        fread(tmp, sizeof(tmp[0]), (infos->offset - HEADER_FILE_SIZE), infos->fp);
        infos->width = tmp[4] + (tmp[5] * 256);
        infos->height = tmp[8] + (tmp[9] * 256);
        infos->depth = tmp[14];
        infos->compress = tmp[16];
    }
    J'espere n'avoir rien oublier.
    Merci encore.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    J'utilise rarement les possibilités d'update des ficheirs (c'est-à-dire de lire et d'écrire dans un meme fichier, bref d'ouvrir des fichiers avec le mode "r+"), mais je crois que ton problème réside justement la, pour passer du mode lecture au mode ecriture, tu dois passer par un appel a fseek, sans quoi tu ne peux pas changer entre le mode lecture et le mode écriture.

    Alors tu pourrais changer un peu ta fonction pour qqch du genre

    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
    void    negatif(t_infos *infos)
    {
        int odepth;
        unsigned char temp[4];
        int nbpix;
        FILE *fp;
        int i;
     
        fp = infos->fp;
        odepth = infos->depth / 8; // Nombre d'octets par pixel.
        nbpix = infos->width * infos->height;
     
        for (i = 0; i < nbpix; i++)
        {
            fseek(fp, 0l, SEEK_CUR); // ------------------------------ <<
            fread(temp, sizeof(temp[0]), odepth, fp);
            temp[0] = OMAX - temp[0];
            temp[1] = OMAX - temp[1];
            temp[2] = OMAX - temp[2];
            temp[3] = OMAX - temp[3];
            fseek(fp, -odepth, SEEK_CUR);
            fwrite(temp, sizeof(temp[0]), odepth, fp);
        }
    }
    Je suis pas 100% sure que ca soit la seule solution mais je crois que ce que je raconte est conforme a la réalité .

    D'ailleurs j'ai l'habitude de faire les entrées par un fichier et faire les sorties dans un autre fichier alors j'ai jamais vraiment eu ce probleme ci...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut
    Merci beaucoup,

    Je ne comprend pas pourquoi tu a mis "0l" dans le fseek
    (quel est la signification du l ?)
    mais effectivement ca marche comme si je mettait 0.

    Donc mon probleme est resolu. Si tu as (ou quelqu'un d'autre)
    des explications au sujet du fseek qui permet de passer
    de l'ecriture a la lecture cela m'aiderait.

    Je placerai ce topic comme resolu un peu plus tard, si quelqu'un
    souhaite ajouter quelque chose avant...

    Merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Citation Envoyé par FOX19881
    Je ne comprend pas pourquoi tu a mis "0l" dans le fseek
    (quel est la signification du l ?)
    mais effectivement ca marche comme si je mettait 0.
    Heh, et ben j'aurais tres bien pu ne pas mettre la lettre l apres le 0, en gros ce que ca veut dire c'est de representer la constante comme un long int et non comme un int (par défaut). Pourquoi ? Parce que fseek prend un long int comme deuxieme argument, et au lieu que la compilateur mettre en place les conversion necessaire (ce qui est totalement transparent lors de la compilation du code source) et ben j'ai explicitement signifié de représenté le 0 comme un long int.

    C'est un peu la meme chose pour les nombres flottants, ils sont par défaut réprésenté comme des double mais tu peux ajouter la lettre f pour forcer le compilateur a les représenter comme un float.


  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Par défaut
    Ok, je savais pas du tout qu'on pouvais faire ca.

    Merci

  6. #6
    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 FOX19881
    Ok, je savais pas du tout qu'on pouvais faire ca.
    Alors il est temps d'acheter un livre de C. Il y a des références sur ce site et sur le mien...

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

Discussions similaires

  1. [Fichier] Problème fichier texte
    Par ben127 dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2006, 21h41
  2. [Fichier] probleme de traitement de fichier
    Par stomerfull dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2006, 14h26
  3. Manipulation Fichiers Audio
    Par black is beautiful dans le forum Audio
    Réponses: 5
    Dernier message: 11/12/2005, 22h21
  4. Lecture de fichier : Probleme avec les string
    Par soda_o_rat dans le forum SL & STL
    Réponses: 10
    Dernier message: 11/08/2005, 22h59
  5. [langage] [Fichier]problème modification de fichier
    Par Melchisedec dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2004, 23h01

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