bonsoir !!
je n'arrive pas a écrire dans un fichier
errno =9 BAD file descriptor comment arrangé ça ??
bonsoir !!
je n'arrive pas a écrire dans un fichier
errno =9 BAD file descriptor comment arrangé ça ??
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.
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 !!
voici mon code :
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
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);
tous ça en utilisant un fichier auxilaire "fptem.txt"
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 ?
Il faut bien entendu avoir utilisé write() de la même manière auparavant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int var; read(fp, &var, sizeof(int));
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...
merci pour toutes ces info
alors le problème est résolu voila ce que j'ai fais
je vais prendre compte de vos conseils pour arrangé mon code
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); }
mercii beaucoup !!
Ç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.
Partager