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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

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