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 :

différence entre le mode binaire et mode texte de fopen()


Sujet :

C

  1. #1
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut différence entre le mode binaire et mode texte de fopen()
    Bonjour,

    Quel est la différence entre ouvir un fichier en mode binaire et en mode texte ? Si je lis 1 caractère dans ce fichier sa représentation binaire sera la même que sa valeur entière ? Ou est ce plus complexe que ça ?


    merci à tous .



    angi.

  2. #2
    Candidat au Club
    Inscrit en
    Décembre 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Le fait d'ouvrir un fichier en mode 'texte' implique que ton fichier contienne des caractère alors q'une ouverture en binaire correspond à une simple suite d'octet !

    C'est un peu en fonction de ton OS. En réalité Unix ne contient que des fichiers en mode binaire (au niveau physique) alors que le DOS fait la distinction !

    Par conséquent, à moins d'utiliser des formats de fichiers particuliers, je te conseille vivement d'utiliser le mode texte !

  3. #3
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut
    Voilà un exemple que j'ai tapé
    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
    char var;
    int taille=0;
    FILE *out, *in;
    clrscr();
    struct stat structinfo;
    stat("test.exe", &structinfo);
    taille = structinfo.st_size;
    out= fopen("test.exe", "r");
    in= fopen("dest.exe","w");
    for (int i=0; i< taille; i++)
        {
        fread(&var,1,1,out);
        fwrite(&var,1,1,in);
        }
        fclose(in);
        fclose(out);
    Dans cet exemple j'ouvre 2 exe test et dest (out et in). Lorsque je lis un caractère que j'écris par la suite dans IN il me lit 1 octet qu'il est censé écrire dans OUT. Supposons que la valeur de l'octet lu soit 54 il est censé m'écrire 54 dans mon fichier destination, hors il m'écris tout sauf 54 ? Et ce qui à la base est un prog (sous dos test.exe) en finale me donne dest.exe qui plante lors du lancement . Je comprend que le problème dépend du mode binaire ou texte mais pourquoi 54 représentant un caractère quelconque, bah en binaire il s'écrit pas 54 ????

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Salut,

    Le fait d'ouvrir un fichier en mode texte, réinterprète le flux en supprimant certains caractères ou encore interprète un caractère spécial comme une fin de fichier (EOF):

    t Open in text (translated) mode. In this mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing with "a+", fopen checks for a CTRL+Z at the end of the file and removes it, if possible. (...)

    Also, in text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. (...)

    b Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed.
    (extrait de la doc VC++ 5.0).

  5. #5
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    En mode texte, certains caractères sont traduits dans un sens à l'écriture, puis dans l'autre à la lecture.
    Exemple:
    \n écrit devient \n\r dans le fichier.
    \n\r lu devient \n en mémoire.

    C'est source de nombreuses prises de têtes et non-portabilités.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  6. #6
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Un grand merci à tous, c'est devenu trés clair grâce à vous .


    Salutations.


    angi.

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

Discussions similaires

  1. Opération binaire en mode binaire et hexadécimal
    Par Latimer dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 23/05/2014, 17h09
  2. Réponses: 2
    Dernier message: 18/09/2012, 14h14
  3. Réponses: 2
    Dernier message: 31/03/2011, 15h57
  4. Réponses: 4
    Dernier message: 29/04/2009, 14h14
  5. différence entre executable et mode debug de visual
    Par thony76 dans le forum Visual C++
    Réponses: 7
    Dernier message: 05/09/2006, 16h00

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