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 :

errno 9 is EBADF - Bad file descriptor commet faire ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Par défaut errno 9 is EBADF - Bad file descriptor commet faire ?
    bonsoir !!
    je n'arrive pas a écrire dans un fichier
    errno =9 BAD file descriptor comment arrangé ça ??

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonsoir.
    Rassure-moi, tu ne penses tout de même pas sérieusement qu'avec aussi peu d'informations, on va pouvoir pointer exactement d'où vient le problème et te trouver une solution ?

    Je ne crois pas m'avancer en disant que personne ici n'est devin, et que par conséquent, sans visualisation du code qui cause l'erreur, personne ne sera apte à te donner une réponse satisfaisante...

    En attendant, bonne soirée.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Par défaut
    bon alors tous d'abord c'est mon deuxième message de la soirée et toujours sur le même problème.
    comme j'avais vu que personne n'a pu trouver la solution a mon problème avec les code que j'ai posté, j'ai préféré trouver le code de l'erreur et le posté en espérant que quelqu'un connaitrai la solution !!

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Par défaut
    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
    42
    43
    44
     
    //mise a jour de pf
    void maj(int fp,int fp1,int fp2)
    {int fptemp,trouv=0,eofpr=1,eofp1=1,eofp2=1;
     char vec1[sizeof(int)],vec2[sizeof(int)],var[sizeof(int)];
     close(fp);
      fptemp=open("fptemp.txt",O_CREAT|O_WRONLY,00700,00070,00007);
      printf("test de creation de fptemp %d \n",fptemp);
      fp=open("fpr.txt",O_RDONLY);
      do
      {
        eofpr=read(fp,var,sizeof(var));
        printf("lecture d'une valeur  %d,%d \n ",eofp1,atoi(var));
        if (eofpr!=0)
        {printf("la recherche commence \n");
          close(fp1);
          close(fp2);
          fp1=open("fp1.txt",O_RDONLY);
          fp2=open("fp2.txt",O_RDONLY);
        do
        { 
          eofp1=read(fp1,vec1,sizeof(vec1));
          printf("la fin de fichier p1  %d \n ",eofp1);
          eofp2=read(fp2,vec2,sizeof(vec2));
          printf("la fin de fichier p2  %d  \n",eofp2);
          if((atoi(var)==atoi(vec1))||(atoi(var)==atoi(vec2))) 
          {
    	printf("valeur recherchée %d \n valeur trouvée %d,%d \n",atoi(var),atoi(vec1),atoi(vec2));
    	trouv=1; printf("valeur trouvée\n");
    	break;
          }
        }while((eofp1!=0)&&(eofp2!=0));
        if (trouv==0)
          { printf("ecriture dans le nouveau fichier\n");
            int test=write(fptemp,var,sizeof(var));
    	printf("test ecriture %d \n",test);
     
          }
          else trouv=0;
        }
      }while(eofpr!=0);
        remove("fpr.txt");
        rename("fptemp.txt","fpr.txt");
      close(fp);close(fp1);close(fp2);
    ce code réalise la mise a jour d'un fichier pricinpale en supprimant les éléments du fichier pricipale qui appartiennes a deux autre fichiers
    tous ça en utilisant un fichier auxilaire "fptem.txt"

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par lucastof Voir le message
    bon alors tous d'abord c'est mon deuxième message de la soirée et toujours sur le même problème.
    comme j'avais vu que personne n'a pu trouver la solution a mon problème avec les code que j'ai posté, j'ai préféré trouver le code de l'erreur et le posté en espérant que quelqu'un connaitrai la solution !!
    Ok.
    Mais il faut que tu comprennes qu'à un même effet peuvent être associées plusieurs causes.
    On dit « les mêmes causes entraînent les mêmes conséquences », mais la réciproque est fausse.


    Ce que je peux dire, c'est que ton appel à open() à la ligne 7 me laisse perplexe.
    Je connais une fonction open() à 2 ou 3 arguments, mais pas plus.
    À moins que la documentation pour ton système/compilateur ne te dise le contraire, tu dois faire un OU binaire pour les permissions.
    Et à vrai dire, ce serait mieux d'utiliser les constantes mises à disposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fptemp = open("fptemp.txt", O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO);

    Je ne vois pas trop l'intérêt de passer en paramètre un descripteur de fichier pour le fermer tout de suite.
    Il faudrait plutôt passer les noms des fichiers en paramètre, et la fonction se charge d'ouvrir et de fermer correctement les fichiers.
    Et si tu connais les noms des fichiers et qu'ils ne changeront jamais, tu n'as même pas besoin de paramètre.
    Mais même dans ce cas, je passerais les noms en paramètre.

    Sinon, je ne pense pas que ce soit une bonne idée de fermer un fichier et de le rouvrir tout de suite après, juste pour se replacer au début du fichier.
    Il y a des fonctions pour déplacer le curseur à l'intérieur d'un fichier, alors autant les utiliser.
    Jette un coup d'œil autour de lseek()...


    La fonction read() n'inscrit pas le caractère nul à la fin du tampon de sortie.
    Donc, quand tu passes à atoi(), qui attend une chaîne de caractères terminée par le caractère nul, tes tableaux de char directement après les avoir remplis grâce à read(), tu prends le risque que atoi() tente de lire des caractères hors de la chaîne.
    Ce genre de choses entraîne un comportement imprévisible, et est à proscrire.

    Et puis, si c'est un entier que tu veux lire, pourquoi ne le fais-tu pas simplement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int var;
    read(fp, &var, sizeof(int));
    Il faut bien entendu avoir utilisé write() de la même manière auparavant...


    Sinon, pour les entrées sorties formatées, on utilise en général les FILE*, à moins d'avoir une bonne raison d'utiliser les descripteurs de fichier.
    Les fonctions équivalentes existent : fopen(), fclose(), fscanf(), fprintf(), fseek(), etc.
    Il y a même une fonction pour ouvrir un FILE* à partir d'un descripteur de fichier : fdopen().
    Mais si tu es plus à l'aise avec les descripteurs de fichier...

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Par défaut
    merci pour toutes ces info
    alors le problème est résolu voila ce que j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     if (trouv==0)
          { printf("ecriture dans le nouveau fichier\n");
            close(fptemp);
            fptemp=open("fptemp.txt",O_WRONLY);
            int test=write(fptemp,var,sizeof(var));
    	printf("test ecriture %d \n",test);
     
          }
    je vais prendre compte de vos conseils pour arrangé mon code
    mercii beaucoup !!

  7. #7
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ça m'étonne que ça ait résolu le problème.
    Et à vrai dire, j'ai même l'impression que ça va en créer un autre.

    Quand on ouvre un fichier sans le drapeau « ajout à la fin » (O_APPEND), le curseur interne est positionné au début du fichier.
    Autrement dit, à chaque fois que tu écriras dans ton fichier « fptemp.txt », tu écraseras le contenu précédent...

    Encore une fois, ce n'est pas une bonne idée de fermer un fichier et de le rouvrir juste après.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    On dit « les mêmes causes entraînent les mêmes conséquences », mais la réciproque est fausse.
    À dire vrai, même dans ce sens-là, ce n'est pas toujours vrai non plus, car cela dépend essentiellement du contexte et de l'historique de l'exécution. La meilleure antithèse étant celle des « race conditions »…

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

Discussions similaires

  1. Bad File descriptor avec fcntl
    Par guigui31 dans le forum Débuter
    Réponses: 2
    Dernier message: 21/04/2008, 20h11
  2. Réponses: 0
    Dernier message: 18/11/2007, 20h53
  3. Erreur: bad file descriptor
    Par Bruno51 dans le forum Langage
    Réponses: 10
    Dernier message: 06/09/2007, 16h44
  4. Bad file descriptor avec un read()
    Par je®ome dans le forum C
    Réponses: 2
    Dernier message: 04/04/2006, 19h30
  5. Etrange "Bad file descriptor"
    Par amauryxiv dans le forum Langage
    Réponses: 23
    Dernier message: 01/02/2006, 03h20

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