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 confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    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
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    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 actif

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    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
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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