écrire dans un fichier texte

Fermé
Linquisiteur - 16 mars 2013 à 20:33
 Linquisiteur - 17 mars 2013 à 00:56
Bonjour, je suis débutant en c et j'essaye de créé des forks qui écrivent dans un fichier. Il s'agit d'une toute nouvelle matière assez difficile et malgré que j'ai lu plusieurs fois la théorie Je n'arrive pas à créé ce programme....

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#define fichiertexte "texte.txt"


int cpt = 0;

while (cpt < 3) //boucle qui créé les 3 fils
     {
      pid_t a = fork();
       if (a < 0) //si le fils à planter
       {   
       perror ("le fork a rate\n");
       exit(EXIT_FAILURE);
       }
       if (a == 0) //si le fils a été créé
       {
       printf ("ecrire dans le fichier texte\n");
       if ((fichier = fopen(texte,"w"))==NULL) {
       perror("Write "); 
       exit(1);
       
       fprintf(fichier,""Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid()););
    }
       
       exit(0);
       }
       cpt++; //on termine la boucle quand on atteint 3 fils
     } 
for(cpt=0;cpt<nb;cpt++)  wait(0); // on termine tout les processus
      exit(EXIT_SUCCESS);  



Voila la liste des erreurs autant dire que bien que j'y ai regarder je n'ai pas sur les corriger..:

bash-2.05$ gcc exo_fichier1.c -o exo_fichier
exo_fichier1.c:13: error: parse error before "while"
exo_fichier1.c:19: error: parse error before numeric constant
exo_fichier1.c:19: error: conflicting types for 'exit'
/usr/local/lib/gcc-lib/sparc-sun-solaris2.9/3.3.2/include/iso/stdlib_iso.h:113: error: previous declaration of 'exit'
exo_fichier1.c:19: warning: data definition has no type or storage class
exo_fichier1.c:26: error: parse error before numeric constant
exo_fichier1.c:26: warning: data definition has no type or storage class
exo_fichier1.c:28: error: parse error before string constant
exo_fichier1.c:28: error: stray '\' in program
exo_fichier1.c:28:82: missing terminating " character
exo_fichier1.c:31: warning: conflicting types for built-in function 'fprintf'
exo_fichier1.c:31: warning: data definition has no type or storage class
exo_fichier1.c:36: error: parse error before numeric constant
exo_fichier1.c:36: warning: data definition has no type or storage class
exo_fichier1.c:36:26: warning: no newline at end of file


Merci d'avance si vous pouvez m'aiguillez vers la voit de la connaissance :)
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
16 mars 2013 à 21:25
Bonjour,

Tu n'as pas de fonctions ??
0
Linquisiteur
16 mars 2013 à 21:33
Non pour le moment je souhaite juste écrire dans un fichier texte. Ensuite je tenterais de progresser en fessant un calcul avec des sémaphore,.. mais je suis à l'aise avec les séma tandis que les fichiers ces que du neuf
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
16 mars 2013 à 21:56
Non mais, tu ne peux pas mettre des instructions comme ça... Il faut qu'elles soient dans une fonction. Un programme doit au moins contenir un main().
0
Linquisiteur
16 mars 2013 à 23:20
Je veux juste aller me pendre... --'
merci de me faire remarquer que j'ai complétement zapper de mettre le main...

Bon j'ai enfin pu comprendre les erreurs enfin pas tous mais j'ai pas mal corriger.. Je ne sais pas comment j'ai pas vu pour mon main, c'est tellement stupide que j'y ai même pas regarder..

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#define fichiertexte "texte.txt"

int main (int argc, char * argv[]){
FILE * texte;
int cpt = 0;

while (cpt < 3) //boucle qui créé les 3 fils
     {
      pid_t a = fork();
       if (a < 0) //si le fils à planter
       {   
       perror ("le fork a rate\n");
       exit(EXIT_FAILURE);
       }
       if (a == 0) //si le fils a été créé
       {
       printf ("ecrire dans le fichier texte\n");
       if ((texte = fopen(texte,"w"))==NULL) {
       perror("Write "); 
       exit(1);
       
       fprintf(texte,""Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid()););
    }
       
       exit(0);
       }
       cpt++; //on termine la boucle quand on atteint 3 fils
     } 
for(cpt=0;cpt<3;cpt++)  wait(0); // on termine tout les processus
      exit(EXIT_SUCCESS); 
}

exo_fichier1.c: In function 'main':
exo_fichier1.c:25: warning: passing arg 1 of 'fopen' from incompatible pointer type
exo_fichier1.c:29: error: parse error before "Je"
exo_fichier1.c:29: error: stray '\' in program
exo_fichier1.c:29:80: missing terminating " character
exo_fichier1.c:38: error: parse error at end of input
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
16 mars 2013 à 23:30
texte = fopen(texte,"w")
Ne veux-tu pas mettre plutôt fichiertexte ?

""Je suis
Tu as mis 2 guillemets.

fprintf(texte,""Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid()););
Tu as );); à la fin. Le premier ferme fprintf(). Le second est donc à supprimer.

exit(EXIT_SUCCESS);
Un main() se termine par return EXIT_SUCCESS; ou return 0; Pas de exit().
0
Linquisiteur
17 mars 2013 à 00:25
encore merci. Je me rend compte que je n'aurais pas du travailler quand je suis et fatigué et que j'ai bu avec des amis.. Je me rend compte que maintenant de mes erreurs..
Tu ma fais diminuer énormément mon paquet d'erreur mais pourquoi je devrais mettre fichiertexte? Je part sur un exemple d'un autre code donc en gros que je comprend même pas ce que j'écris malgré que j'ai lu la théorie.



Bon voila j'ai modifier encore qq petite chose en essayant de bien comprendre. Sa compile mais je n'ai rien qui s'écrit dans le fichier: "fichier.txt"

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#define fichiertexte "texte.txt"

FILE * fichier;

int main (int argc, char * argv[]){
FILE * texte;
int cpt = 0;

while (cpt < 3) //boucle qui créé les 3 fils
{
pid_t a = fork();
if (a < 0) //si le fils à planter
{
perror ("le fork a rate\n");
exit(EXIT_FAILURE);
}
if (a == 0) //si le fils a été créé
{
printf ("ecrire dans le fichier texte\n");
if ((fichier = fopen(fichiertexte,"w"))==NULL) {
perror("Write ");
exit(1);

fprintf(texte,"Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid());
}

exit(0);
}
cpt++; //on termine la boucle quand on atteint 3 fils
}
for(cpt=0;cpt<3;cpt++) wait(0); // on termine tout les processus
EXIT_SUCCESS;
}



bash-2.05$ gcc exo_fichier1.c -o exo_fichier
bash-2.05$ exo_fichier
ecrire dans le fichier texte
ecrire dans le fichier texte
ecrire dans le fichier texte


Pourtant je vois que je passe dans tout les fork.. malgré cela mon fichier texte est vide
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 17/03/2013 à 00:41
mais pourquoi je devrais mettre fichiertexte?
Ben, dans fopen(), on met en 1ère argument le nom du fichier dans lequel on veut écrire ou lire.
Tu as mis en début de code : #define fichiertexte "texte.txt"
Donc, en mettant fichier=fopen(fichiertexte,"w"); tu tenteras d'écrire dans "texte.txt". La variable fichier te permettra d'écrire dans fichiertexte soit "texte.txt".

Je ne vois toujours pas de return EXIT_SUCCESS; dans ton code... Tu as mis simplement EXIT_SUCCESS, ça ne veut pas dire grand chose.

fprintf(texte,"Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid());
Tu écris sur le pointeur texte qui pointe sur rien... Il faut mettre : fprintf(fichier,...) c'est fichier qui pointe sur le fichier fichiertexte.

N'oublie pas non plus, fclose(fichier); Ouvrir un fichier c'est bien le refermer c'est mieux !

Et enfin, n'utilise pas le bouton "souligné" pour poster un code. C'est désagréable à lire. Utilise comme tu faisais au début (bouton code, à droite de "souligné"). Merci d'avance pour mes yeux :-).
0