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 :

Manipuler plusieurs fichiers de données dans un programme


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Manipuler plusieurs fichiers de données dans un programme
    Salut à tous,

    J'ai un problème pour lequel je désire votre aide. Voilà, il me faut écrire un program qui lit 3 fichiers de donnés:


    employees.txt qui contient les rubriques suivantes: no_emp, nom, taux
    Contenu:
    001 John 19.75325
    002 Nacha 17.60125
    003 Mark 18.12356
    004 Alain 20.82431
    005 Solange 16.25634




    Wk13102009.txt : avec no_emp, jour1, jour2, jour3,jour4, jour5
    Contenu:
    001 9 9 9 10 9
    002 9 9 8 8 9
    003 9 9 9 9 9
    004 7 8 8 9 9
    005 9 9 9 9 9




    GeneralPay.txt : no_emp, paie_cumulee, taxe_cumulee, a_deduct_cumulee
    (les montants sont du type float avec 6 positions après la virgule)
    Contenu:
    001 114563.367188 38200.050781 12115.719727
    002 99397.281250 29632.150391 7111.390137
    003 103297.453125 30184.080078 10095.730469
    004 120938.453125 41424.019531 14081.179688
    005 90438.250000 21437.169922 5678.950195



    et qui crée un quatrième fichier PaieSemaineCourante.txt, écrit les rubriques nécessaires et mets à jour le fichier GeneralPay.txt après traitement des donnés.

    Le mode d'accès à tous les fichiers est séquentiel.

    Veuillez, s'il vous plait, en m'aidant considérer que mon niveau en programmation est encore de débutant.

    Toutefois, j'ai pu écrire le programme que je soumets ci-dessous, mais il ne semble pas tourner correctement. Les données résultant de l'éxécution sont erronées, donc contraire à celles escomptées et l'écriture sur les fichiers ressemble plutôt à du charabia ...
    Faut-il appliquer un formatage pour l'écriture sur fichier??

    Après éxécution, je reçois le message d'erreur suivant: "Run-Time Check Failure #2 - Stack around the variable "no_emp" was corrupted"
    Qu'est-ce que cela veut dire?

    Aussi, si vous pouvez me pointer sur la bonne direction concernant de la documentation sur le sujet (manipulation des fichiers aussi bien l'accès séquentiel que l'accès direct)pour que j'approfondisse mes connaissances. Merci à tous.


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    /*Lire trois fichiers de données et écrire sur un quatrième fichier*/
     
     
     
    #include<stdio.h>
    #include<stdlib.h>
     
    float paie(char*, float, float); /* function prototype */
     
    int main(void)
    {
    	char no_emp[4], nom[11]; 
    	int jour1, jour2, jour3, jour4, jour5;
    	float taux, salaire_brut, taxe, a_deduct, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee, nbr_heures;  
     
    	FILE *fp1, *fp2, *fp3, *fp4;   
    	/*
    		fp1 = fopen ("employees.txt")
    		fp2 = fopen ("GeneralPay.txt")
    		fp3 = fopen ("Wk11102009.txt")
    		fp4 = fopen ("PaieSemaineCourante.txt")
     
    	*/
     
    	/* fopen ouvre le fichier. Exit le pgm en cas de problème */
    	if ((fp3 = fopen("Wk13102009.txt", "r")) == NULL)
    	{
    		printf("\n\tImpossible de lire Wk13102009.txt\n");
    	}
    	else
    	{	
    		if ((fp1 = fopen("employees.txt", "r")) == NULL)
    			{
    				printf("\n\tImpossible de lire employees.txt\n");
    			}
    		else
    		{
    			if ((fp2 = fopen("GeneralPay.txt", "r+")) == NULL)
    				{
    					printf("\n\tImpossible de lire GeneralPay.txt\n");
    				}
    			else
    			{
    				if ((fp4 = fopen("PaieSemaineCourante.txt", "a")) == NULL)
    						{
    							printf("\n\tImpossible de lire PaieSemaineCourante.txt.txt.\n");
    						}
    						else
    						{
     
     
    							while (!feof(fp3))
    							{
     
     
    								fscanf(fp3, "%s%d%d%d%d%d", no_emp, &jour1, &jour2, &jour3, &jour4, &jour5);
    								fscanf(fp1, "%s%s%f",   no_emp, nom, &taux);
    								fscanf(fp2, "%s%f%f%f", no_emp, &paie_cumulee, &taxe_cumulee, &a_deduct_cumulee );
     
    								nbr_heures = jour1 + jour2 + jour3 + jour4 + jour5;
     
    								salaire_brut = paie( no_emp, nbr_heures, taux);
     
    								taxe = salaire_brut * 0.30;
     
    								a_deduct = salaire_brut * 0.08;
     
    								salaire_net = salaire_brut - taxe - a_deduct;
     
    								//mise à jour des donnes cumulées dans GeneralPay.txt
    								paie_cumulee += salaire_net;
    								taxe_cumulee += taxe;
    								a_deduct_cumulee += a_deduct;
     
    								//écrire une ligne dans le fichier PaieSemaineCourante.txt
    								fprintf(fp4, "%s %s %.5f %2d %.5f %.2f %.2f %.2f%.2f\n", no_emp, nom, taux, 
    									nbr_heures, salaire_brut, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
     
    								//écrire une ligne GeneralPay.txt
    								fprintf(fp2, "%s%.2f %.2f %.2f\n", no_emp, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
     
                                  	//remise des variables à zéro
    								nbr_heures = 0;
    								salaire_brut = 0;
    								taxe = 0;
    								a_deduct = 0;
    								salaire_net = 0;
     
     
    							}//fin de la boucle while
    							fclose(fp2);
    							fclose(fp1);
    							fclose(fp4);
     
     
    				}
    			}
     
    		fclose(fp3);	
    		}
     
    	}
    	printf("Program terminé sans normalement !\n\n\n");
    	system("pause");
    	return 0;
     
    }
     
     
     
    float paie( char *no_empo, float nbr_heures, float taux)
    {
     
    	float s_brut;
     
     
     
    		s_brut = nbr_heures * taux;
     
     
     
    	return (s_brut);
     
    }

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Dans la fonction paie, il sert à quoi ton argument => no_empo (char)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    float paie( char *no_empo, float nbr_heures, float taux);
    {
     
    	float s_brut;
     
     
     
    		s_brut = nbr_heures * taux;
     
     
               /* la variable no_empo n' est pas utilisée */
    	return (s_brut);
    }
    J' ai testés ton code, et j' ai pas de message d' erreur à la fin de son exécution.
    Des données bizarres:
    modification dans la boucle while:
    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
     
    while (!feof(fp3))
    {
     
         fscanf(fp3, "%s%d%d%d%d%d", no_emp, &jour1, &jour2, &jour3, &jour4, &jour5);
         fscanf(fp1, "%s%s%f",   no_emp, &nom, &taux);
         fscanf(fp2, "%s%f%f%f", no_emp, &paie_cumulee, &taxe_cumulee, &a_deduct_cumulee );
     
         nbr_heures = jour1 + jour2 + jour3 + jour4 + jour5;
         printf ( " nbr_heures=> %f \n", nbr_heures); /* la modif */
         salaire_brut = paie( no_emp, nbr_heures, taux);
         taxe = salaire_brut * 0.30;
     
         a_deduct = salaire_brut * 0.08;
     
         salaire_net = salaire_brut - taxe - a_deduct;
         //mise à jour des donnes cumulées dans GeneralPay.txt
         paie_cumulee += salaire_net;
         taxe_cumulee += taxe;
         a_deduct_cumulee += a_deduct;
         //écrire une ligne dans le fichier PaieSemaineCourante.txt
         fprintf(fp4, "%s %s %.5f %2d %.5f %.2f %.2f %.2f%.2f\n", no_emp, nom, taux,
         nbr_heures, salaire_brut, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
     
        //écrire une ligne GeneralPay.txt
        fprintf(fp2, "%s%.2f %.2f %.2f\n", no_emp, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
     
        //remise des variables à zéro
        nbr_heures = 0;
        salaire_brut = 0;
        taxe = 0;
        a_deduct = 0;
        salaire_net = 0;
     
     
    }//fin de la boucle while
    ce qui donne:
    nbr_heures=> 46.000000
    nbr_heures=> 812672632.000000
    nbr_heures=> 92.000000
    nbr_heures=> 909651538.000000
    nbr_heures=> 36.000000
    Program terminÚ sans normalement !
    C' est dur d' avoir 909651538 heures de travaille

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Plusieurs erreurs :

    - Celle qui se manifeste immédiatement : le format de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fprintf(fp4, "<%s %s %.5f %2d %.5f %.2f %.2f %.2f%.2f>\n", no_emp, nom, taux,
            nbr_heures, salaire_brut, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
    est incorrect : nbr_heures est un float et correspond à un %2d (Pourquoi d'ailleurs est-il un float alors que jour1,... sont eux des int ?). Accessoirement, il manque un blanc entre les deux derniers termes du format.

    - L'utilisation de feof() est incorrecte (avec pour résultat un dernier enregistrement doublé). Procéder plutôt par test du scanf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (fscanf(fp3, "%s%d%d%d%d%d", no_emp, &jour1, &jour2, &jour3, &jour4, &jour5)!= EOF)
    - plus délicat, l'utilisation de fp2 ouvert en "r+".
    Avec un fichier ouvert en "+", on ne peut passer impunément de la lecture à l'écriture et vice versa sans précaution : on ne peut passer de lecture en écriture sans repositionner le fichier et d'écriture en lecture sans fflush() ou un repositionnement du fichier.
    On doit donc avoir par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    long pos;
    ....
         while (fscanf(fp3, "%s%d%d%d%d%d", no_emp, &jour1, &jour2, &jour3, &jour4, &jour5)!= EOF)
         {
            fscanf(fp1, "%s%s%f",   no_emp, nom, &taux);
            pos = ftell(fp2); // stocker la position
    	fscanf(fp2, "%s%f%f%f", no_emp, &paie_cumulee, &taxe_cumulee, &a_deduct_cumulee );
    ....
            fprintf(fp4, "<%s %s %.5f %2d %.5f %.2f %.2f %.2f %.2f>\n", no_emp, nom, taux,
                   (int)nbr_heures, salaire_brut, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
            fseek(fp2,pos,SEEK_SET); // repositionner le fichier
    	fprintf(fp2, "%s %.2f %.2f %.2f\n", no_emp, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
            fflush(fp2);  // vider le buffer du fichier
    ....
    Enfin, le fichier résultant ne sera pas tronqué. Autrement dit, si le texte après modification est plus court que le texte d'origine, il restera à la fin des séquelles de l'ancien fichier. C'est le cas ici où les formats de réécriture sont plus courts (%.2f) que ceux du format d'origine (%.6f)
    En clair, l'utilisation de "+" pour les fichiers texte est à déconseiller si on maîtrise pas à coup sûr le nombre de caractères sur chaque ligne et le nombre de lignes. Il est préférable de passer par la construction d'un autre fichier de sortie, quitte à le renommer ensuite et à détruire l'ancien.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Très satisfait
    Dans la fonction paie, il sert à quoi ton argument => no_empo (char)
    A regarder de plus près, je m'aperçois que tu as bien raison, monwarez...
    Au fait, j' avais à l'esprit que le fait que chaque employée ait un taux différent, la fonction aurait besoin du no_emp pour identifier l'employée X et donc appliquer le taux correspondant, alors qu' au fait pour un enregistrement lu dans le fichier employees.txt, le taux, le nom ainsi que le no_emp sont chargés en mémoire. Et au moment de l'appel de la fonction paie, c'est le taux en mémoire qui est appliqué. Donc, nul besoin de le passer en argument. Merci de la remarque.

    Plusieurs erreurs :
    Merci beaucoup également à toi diogene pour avoir épinglé toutes ces erreurs et fait des remarques aussi pertinentes et donné des détails clairs et bien expliqués.
    J' ai pu porter des modifications à mon programme, incorporant tes remarques et maintenant là, il tourne parfaitement et produit les sorties escomptées.

    Cependant, il me va falloir approfondir mes connaissances sur la manipulation des fichiers. Mais déjà, je suis sur la bonne voie...
    Toutefois avez des liens à suggérer?

    Coup de chapeau !

    Voici le programme final:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    /*Lire trois fichiers de données et écrire sur un quatrième fichier*/
     
     
     
    #include<stdio.h>
    #include<stdlib.h>
     
    float paie(float, float); /* function prototype */
     
    int main(void)
    {
    	char no_emp[4], nom[11]; 
    	int jour1, jour2, jour3, jour4, jour5;
    	float taux, salaire_brut, taxe, a_deduct, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee, nbr_heures;  
    	long pos;
     
    	FILE *fp1, *fp2, *fp3, *fp4;   
    	/*
    		fp1 = fopen ("employees.txt")
    		fp2 = fopen ("GeneralPay.txt")
    		fp3 = fopen ("Wk11102009.txt")
    		fp4 = fopen ("PaieSemaineCourante.txt")
     
    	*/
     
    	/* fopen ouvre le fichier. Exit le pgm en cas de problème */
    	if ((fp3 = fopen("Wk13102009.txt", "r")) == NULL)
    	{
    		printf("\n\tImpossible de lire Wk13102009.txt\n");
    	}
    	else
    	{	
    		if ((fp1 = fopen("employees.txt", "r")) == NULL)
    			{
    				printf("\n\tImpossible de lire employees.txt\n");
    			}
    		else
    		{
    			if ((fp2 = fopen("GeneralPay.txt", "r+")) == NULL)
    				{
    					printf("\n\tImpossible de lire GeneralPay.txt\n");
    				}
    			else
    			{
    				if ((fp4 = fopen("PaieSemaineCourante.txt", "a")) == NULL)
    						{
    							printf("\n\tImpossible de lire PaieSemaineCourante.txt.txt.\n");
    						}
    						else
    						{
     
     
    							while (fscanf(fp3, "%s%d%d%d%d%d", no_emp, &jour1, &jour2, &jour3, &jour4, &jour5)!= EOF)
    							{
     
     
    								fscanf(fp1, "%s%s%f",   no_emp, nom, &taux);
    								// stocker la position
    								pos = ftell(fp2); 
    								fscanf(fp2, "%s%f%f%f", no_emp, &paie_cumulee, &taxe_cumulee, &a_deduct_cumulee );
     
    								nbr_heures = jour1 + jour2 + jour3 + jour4 + jour5;
     
    								salaire_brut = paie( nbr_heures, taux);
     
    								taxe = salaire_brut * 0.30;
     
    								a_deduct = salaire_brut * 0.08;
     
    								salaire_net = salaire_brut - taxe - a_deduct;
     
    								//mise à jour des donnes cumulées dans GeneralPay.txt
    								paie_cumulee += salaire_net;
    								taxe_cumulee += taxe;
    								a_deduct_cumulee += a_deduct;
     
     
    								//écrire une ligne dans le fichier PaieSemaineCourante.txt
    								fprintf(fp4, "%s %s %.5f %2d %.5f %.2f %.2f %.2f %.2f\n", no_emp, nom, taux,
    									(int)nbr_heures, salaire_brut, salaire_net, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
     
    								// repositionner le fichier
    								fseek(fp2,pos,SEEK_SET); 
     
    								//écrire une ligne mettant à jour un enregistrement dans GeneralPay.txt
    								fprintf(fp2, "%s %.6f %.6f %.6f\n", no_emp, paie_cumulee, taxe_cumulee, a_deduct_cumulee);
    								// vider le buffer du fichier
    								fflush(fp2);  
     
                                  	//remise des variables à zéro
    								nbr_heures = 0;
    								salaire_brut = 0;
    								taxe = 0;
    								a_deduct = 0;
    								salaire_net = 0;
     
    							}//fin de la boucle while
     
     
    				}
    				fclose(fp4);
    			}
    			fclose(fp2);
     
    		}
    		fclose(fp1);
     
    	}
    	fclose(fp3);
    	printf("Program termine normalement !\n\n\n");
    	system("pause");
    	return 0;
     
    }
     
     
     
    float paie( float nbr_heures, float taux)
    {
     
    	float s_brut;
     
    		s_brut = nbr_heures * taux;
     
    	return (s_brut);
     
    }

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Toutefois avez des liens à suggérer
    Tu as une bonne initiation aux fichiers avec les tutoriels de ce site. Par exemple Les fichiers en langage C

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Tu as une bonne initiation aux fichiers avec les tutoriels de ce site. Par exemple Les fichiers en langage C
    Merci diogene!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/06/2015, 00h42
  2. Manipuler plusieurs fichiers xml dans une macro VB
    Par rhavena dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/08/2014, 09h39
  3. Comment manipuler plusieurs fichiers Excel
    Par Olivier0 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 16/08/2007, 08h38
  4. Réponses: 5
    Dernier message: 23/02/2007, 15h56
  5. Réponses: 6
    Dernier message: 18/05/2006, 09h29

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