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 :

Fichier binaire : cstdio, fwrite/fread ou fstream.read/write ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut Fichier binaire : cstdio, fwrite/fread ou fstream.read/write ?
    Bonjour,



    J'aimerais connaître l'intérêt d'utiliser fstream en lecture et écriture de fichiers binaires avec le C++ quand son équivalent C de cstdio, avec fread et fwrite, est si pratique et pertinent dans son utilisation.

    Quel est le risque d'utiliser cstdio pour manipuler un fichier binaire en plein code C++ ?

  2. #2
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    C'est deux façons différentes de gérer les fichiers.
    Il n'y a pas de risque.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    En codant sous Visual 2005, il met fopen en avertissement malgré le fait que l'exe a l'air de très bien fonctionner.

    warning C4996: 'fopen' a été déclaré désapprouvé

    J'ai déjà lu ici et là que c'était mieux avec fstream sans explication à côté.

  4. #4
    Membre régulier

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Points : 70
    Points
    70
    Par défaut
    Tu peux écrire #define _SCL_SECURE_NO_WARNINGS pour faire le taire le compilateur. Visual C++ veut que tu utilises ses versions "sécuritaires" des fonctions de librairie, (dans ce cas-ci ce serait fopen_s), mais ce n'est pas portable.

    Le gros avantage pour moi est que fstream peut lancer une exception si une opération échoue:

    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
    // ios::exceptions
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    int main () {
      ifstream file;
      file.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
      try {
        file.open ("test.txt");
        while (!file.eof()) file.get();
      }
      catch (ifstream::failure e) {
        cout << "Exception opening/reading file";
      }
     
      file.close();
     
      return 0;
    }

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Un des interets des IOStreams sur l'interface C pour faire des IO, c'est l'extensibilite. Tu peux faire un {i,o}strem qui utilise le reseau ou l'interface graphique; tout ce que ta fonction qui fait des IO a besoin de savoir, c'est qu'elle prend un {i,o}stream. C'est pas possible de faire ca avec des FILE, sauf extension non standard d'une implementation de la bibliotheque.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Tiens, je connais pas cette partie, cette syntaxe, « {i,o}stream » ne me dit rien.


    En fait, quand on bosse sur des gros fichiers avec une structure précise, on sollicite beaucoup les fread()/fichier.read().

    On ne peut pas se permettre de tout mettre en tampon.


    Ce qui est pratique avec fread(), c'est son troisième paramètres pour les tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned short tab[6] = {101, 303, 202, 404, 606, 505};
    fread(&tab, sizeof(short), 6, fichier);
    Alors qu'avec fichier.read() qui n'a que deux paramètres dont le premier est déjà bien bizarre...

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Nikolas Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned short tab[6] = {101, 303, 202, 404, 606, 505};
    fread(&tab, sizeof(short), 6, fichier);
    Alors qu'avec fichier.read() qui n'a que deux paramètres dont le premier est déjà bien bizarre...
    J'ai du mal a voir une difference entre le premier parametre de istream::read et celui de fread, quant au deuxieme, il est simplement le produit des deuxieme et troisieme de fread.

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Nikolas Voir le message
    Tiens, je connais pas cette partie, cette syntaxe, « {i,o}stream » ne me dit rien.
    Comprendre istream / ostream/ stream, c'est, simplement, une manière de parler des flux entrants , sortants et indéterminés de manière générale

    L'ensemble des flux utilisables en C++ dérive au minimum d'une de ces trois sortes de flux, à toi d'adapter selon tes besoins

Discussions similaires

  1. Commande Seek et Read (Fichier Binaire)
    Par DelphiBug dans le forum Débuter
    Réponses: 0
    Dernier message: 10/05/2009, 03h17
  2. Fread() fichier binaire
    Par MClover dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 08/11/2008, 18h12
  3. [fread] Lecture de fichier binaire
    Par christophe_halgand dans le forum MATLAB
    Réponses: 16
    Dernier message: 03/11/2008, 18h17
  4. [fstream] Lecture d'un fichier binaire
    Par poukill dans le forum SL & STL
    Réponses: 6
    Dernier message: 19/06/2007, 09h27
  5. Probleme fstream fichier binaire
    Par Samildanach dans le forum SL & STL
    Réponses: 4
    Dernier message: 19/02/2007, 16h24

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