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 :

Bad file descriptor avec un read()


Sujet :

C

  1. #1
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut Bad file descriptor avec un read()
    Bonsoir,

    j'essaie de copier un fichier en utilisant les primitives systèmes,
    mais j'ai tout le temps une erreur de lecture.
    Si vous pouviez me donner votre avis, ça serait sympa.

    Voici mon code:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<unistd.h>
    #include<fcntl.h>
    #define MAX 4096
     
    main&#40;&#41;
    &#123;
    	int fd1,fd2;
    	int n;
    	char buffer&#91;MAX&#93;;
    	//buffer=malloc&#40;sizeof&#40;char&#41;*4096&#41;;
    	fd1=open&#40;"toto",O_WRONLY&#41;;
    	if&#40;fd1==-1&#41;
    	&#123;
    		perror&#40;"Ouverture impossible !"&#41;;
    		exit&#40;1&#41;;
    	&#125;
    	fd2=open&#40;"titi",O_WRONLY | O_CREAT | O_TRUNC,0666&#41;;
    	if&#40;fd2==-1&#41;
    	&#123;
    		perror&#40;"Creation du fichier impossible !"&#41;;
    		exit&#40;1&#41;;
    	&#125;
    	while&#40;&#40;n=read&#40;fd1,buffer,MAX&#41;&#41;>0&#41;
    	&#123;
    		write&#40;fd2,buffer,n&#41;;
    	&#125;
    	if&#40;n==-1&#41;                //   L' erreur se passe donc ici 
    	&#123;
    		perror&#40;"Erreur de lecture !"&#41;;  
    		exit&#40;1&#41;;
    	&#125;
    	close&#40;fd1&#41;;
    	close&#40;fd2&#41;;
     
    	exit&#40;0&#41;;
    &#125;
    Je n'ai pas d'erreur lors de la compilation.
    Le fichier titi est bien crée, mais il reste vide, donc je pense qu' il y a bien erreur de lecture du fichier toto.

    Merci de votre aide,

    Jerome
    Wer nicht probiert, verliert !!

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut Re: Bad file descriptor avec un read()
    Citation Envoyé par je®ome
    Je n'ai pas d'erreur lors de la compilation.
    Alors c'est que ton compilateur est d'une indulgence extreme.

    Citation Envoyé par Mon compilo d'amour
    test.c:10: warning: return type defaults to ‘int’
    test.c: In function ‘main’:
    test.c:14: error: syntax error before ‘/’ token
    test.c:31: error: syntax error before ‘/’ token
    test.c:31: error: stray ‘L’ in program
    test.c:35: warning: control reaches end of non-void function
    test.c: At top level:
    test.c:36: warning: type defaults to ‘int’ in declaration of ‘close’
    test.c:36: warning: parameter names (without types) in function declaration
    test.c:36: warning: data definition has no type or storage class
    test.c:37: warning: type defaults to ‘int’ in declaration of ‘close’
    test.c:37: warning: parameter names (without types) in function declaration
    test.c:37: warning: data definition has no type or storage class
    test.c:39: error: syntax error before numeric constant
    test.c:39: warning: type defaults to ‘int’ in declaration of ‘exit’
    test.c:39: error: conflicting types for ‘exit’
    test.c:39: warning: data definition has no type or storage class
    ...
    Remarque: en fait, ces erreurs proviennent seulement des commentaires C++-like et du fait qu'il manque le type de main().

    Au niveau de ton erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fd1=open&#40;"toto",O_WRONLY&#41;; 
    /*   .....  */
    while&#40;&#40;n=read&#40;fd1,buffer,MAX&#41;&#41;>0&#41;
    Tu tentes de lire sur un fd qui a ete ouvert en WRONLY, autrement appele "ecriture seule".

    C'est mal.

    Remplace par O_RDONLY.
    Ca marche mieux.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<fcntl.h>
     
    #define MAX 4096
     
    int                     main&#40;void&#41;
    &#123;
      int                   fd1;
      int                   fd2;
      int                   n;
      char                  buffer&#91;MAX&#93;;
     
      fd1 = open&#40;"toto", O_RDONLY&#41;;
      if&#40;fd1 == -1&#41;
        &#123;
          perror&#40;"Ouverture impossible"&#41;;
          return &#40;EXIT_FAILURE&#41;;
        &#125;
      fd2 = open&#40;"titi", O_WRONLY | O_CREAT | O_TRUNC, 0666&#41;;
      if&#40;fd2 == -1&#41;
        &#123;
          perror&#40;"Creation du fichier impossible !"&#41;;
          return &#40;EXIT_FAILURE&#41;;
        &#125;
      while&#40;&#40;n = read&#40;fd1, buffer, MAX&#41;&#41; > 0&#41;
        &#123;
          write&#40;fd2, buffer, n&#41;;
        &#125;
      if&#40;n == -1&#41;/*                 //   L' erreur se passe donc ici */
        &#123;
          perror&#40;"Erreur de lecture"&#41;;
          return &#40;EXIT_FAILURE&#41;;
        &#125;
      close&#40;fd1&#41;;
      close&#40;fd2&#41;;
      return &#40;EXIT_SUCCESS&#41;;
    &#125;
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  3. #3
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    merci, je ne sais pas ou j'avais la tete.

    c'est sûr que comme moi je l'avais écris, ça ne donnait pas de sens.

    encore merci
    Wer nicht probiert, verliert !!

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

Discussions similaires

  1. Bad file descriptor lors d'un write().
    Par gregb34 dans le forum Bibliothèque standard
    Réponses: 1
    Dernier message: 24/04/2008, 18h56
  2. Bad File descriptor avec fcntl
    Par guigui31 dans le forum Débuter
    Réponses: 2
    Dernier message: 21/04/2008, 21h11
  3. Réponses: 0
    Dernier message: 18/11/2007, 21h53
  4. Erreur: bad file descriptor
    Par Bruno51 dans le forum Langage
    Réponses: 10
    Dernier message: 06/09/2007, 17h44
  5. Etrange "Bad file descriptor"
    Par amauryxiv dans le forum Langage
    Réponses: 23
    Dernier message: 01/02/2006, 04h20

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