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 :

fopen et open;fichiers bufférisés.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Par défaut fopen et open;fichiers bufférisés.
    bonjour, ce code est tiré du tutoriel de Patrick TRAU à l'adresse:
    http://www-ipst.u-strasbg.fr/pat/program/tpc.htm
    il permet de copier un fichier source vers un fichier de destination.
    s'il vous plaît, pourquoi le: (char*)buffer ??

    une autre chose: dans ce cours, on dit que les fonctions fopen, fread et fwrite utilisent des fichiers "bufférisés", à la différence de open, read et write, qui utilisent des fichiers bruts.
    il dit aussi sur les fichiers bufférisés:
    Ceci signifie qu'une instruction d'écriture n'impliquera pas une écriture physique sur le disque mais dans le buffer, avec écriture sur disque uniquement quand le buffer est plein.
    alors, fopen, fread et fwrite n'écrivent pas sur le disque ??

    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
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys\stat.h>
    #define taillebloc 1024
    int main(int argc,char *argv[])
     {
      int source, destination;
      char buffer[taillebloc];
      int nb_lus,nb_ecrits;
      if (argc!=3) {puts("erreur arguments");return(1);}
      if((source=open(argv[1],O_RDONLY|O_BINARY))<0)
       {puts("erreur ouverture");return(2);}
      if((destination=open(argv[2], O_WRONLY| O_CREAT| O_TRUNC| O_BINARY,
        S_IREAD| S_IWRITE| S_IEXEC))<0)
             {puts("erreur ouverture");return(2);}
      do
       {
        nb_lus=read(source,(char *)buffer,taillebloc);
        if (nb_lus>0) nb_ecrits= write(destination,(char*)buffer, nb_lus);
       }
      while ((nb_lus==taillebloc)&&(nb_ecrits>0));
      close(source);
      close(destination);
      return(0);
     }
    Merci.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par yessine66 Voir le message
    il dit aussi sur les fichiers bufférisés: alors, fopen, fread et fwrite n'écrivent pas sur le disque ??
    fopen(), fread() ? écrire sur le disque ? Je ne pense pas

    Sinon, je te rassure, fwrite() écrit sur le disque mais quand le buffer est plein.

    Ceci signifie qu'une instruction d'écriture n'impliquera pas une écriture physique sur le disque mais dans le buffer, avec écriture sur disque uniquement quand le buffer est plein.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    s'il vous plaît, pourquoi le: (char*)buffer ??
    En tant qu'argument d'une fonction, buffer est déjà du type char*. Le cast est inutile.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Par défaut
    je vous remercie..
    Pour finir, fopen, fread et fwrite ne peuvent pas manipuler des fichiers "classiques" (du disque dur) ?

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour finir, fopen, fread et fwrite ne peuvent pas manipuler des fichiers "classiques" (du disque dur) ?
    Heureusement que si.

    "E/S Bufferisées" signifie qu'entre le disque (ou le périphérique) et ton programme, il y a un tampon (buffer).
    Pour une lecture, le tampon est rempli à partir du disque avec les données et le programme lit le contenu du tampon. Quand il a tout lu, le tampon est à nouveau automatiquement rempli à partir du disque.
    Pour une écriture, le programme écrit dans le tampon. Quand le tampon est plein (ou qu'on ferme le fichier) le tampon est écrit sur le disque.

    Le but de ce mic-mac est de limiter le nombre d'accès aux données du disque.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Par défaut
    Je vous remercie. Je comprends qu'il existe deux cas:

    -machine possédant un large tampon, qui suffit pour l'écriture pendant tout le programme c. Après la fermeture du tampon, on l'écrit sur le disque(qui est le but final en fait, sinon, à quoi sert un tampon qui sera vide aussitôt que le programme se ferme, ou que la machine sera éteinte ?? à rien je suppose)

    -tampon insuffisant: à chaque fois que le programme le remplit, il est écrit sur le disque, puis réutilisé, puis rempli, etc...jusqu'à compléter l'écriture.

    Est-ce vrai?
    Merci pour votre patience.

Discussions similaires

  1. [fopen] création de fichier dans un répertoire donné
    Par bakaratoun dans le forum MATLAB
    Réponses: 4
    Dernier message: 09/12/2009, 14h39
  2. [fopen] Lire un fichier
    Par casper84 dans le forum MATLAB
    Réponses: 3
    Dernier message: 14/01/2008, 16h11
  3. [Système] fonction fopen ! exporter en fichier txt
    Par cseb73 dans le forum Langage
    Réponses: 5
    Dernier message: 13/08/2007, 16h32
  4. [FTP] Erreur fopen si le fichier existe déja
    Par psykbe dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2006, 14h00
  5. fopen sur un fichier en réseau local
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 12/01/2006, 17h32

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