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 :

Réduire un montant et modifier une valeur à partir d'un fichier


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Réduire un montant et modifier une valeur à partir d'un fichier
    Salut à tous et à toutes, quelqu'un pourrait me guider dans mon problème svp car je suis bloquée... ? Voici la consigne de mon formateur:

    2 choses à faire :
    1) La réduction de 150 du montant de la cotisation pour tous les membres du club "LESMEILLEURS"
    2) La modification de la valeur 'club' d'un enregistrement dont le numéro est fourni au clavier par l'utilisateur. La nouvelle valeur 'club' sera également entrée au clavier par l'utilisateur.

    Remarques :
    le fichier original f1 est consituté d'enregistrement dont les informations sont organisées de la manière suivante:
    1)une chaine de maximum 30 caractères représentant la valeur 'nom' toujours exprimée en caractères minuscules,
    2)une chaine de maximum 40 caractères représentant la valeur 'nom' toujours exprimée en caractères majuscules,
    3)une valeur de type int représentant la valeur "cotisation"
    Je vous partage ce que je tente de réaliser ces dernières semaines car plus rien me vient à l'esprit pour améliorer ce code. Soyez indulgent quant à mon niveau s'il vous plait car je me suis déjà donné du mal pour un truc que je sais ne tourne pas.
    Par contre, je suis très ouverte aux critiques constructives qui visent à m'aider pour ne plus faire les mêmes erreurs et donc m'améliorer...
    Je préviens d'avance s'il vous plait de ne pas venir me dire qu'il ne faut jamais utiliser une fonction blacklistée ou banni (ou tout ce que vous voulez) car c'est mon formateur qui me les impose et je suis donc obligée de les utiliser (donc il n'y aura hélas pas la fonction fgets à la place de gets même si c'est très con. Je n'y peux rien, c'est les études je dois passer par là...)

    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
     
     
    #include <conio.h> //bilbio contenant la fonction getch()
    #include <stdio.h>
    #include <sdlib.h> 
    #include <string.h> //strcmp() et strcpy()
     
    void init_fichier(FILE *);
     
    	void modifienom (char *);
    	void modifieclub (char *);
     
    	struct membre
    	{
    	char nom [31], club[41];
    	int cotisation;
    	} ;
     
    	typedef struct membre MEMBRE;
     
    	int main(int argc, char * argv[])
    	{
    	FILE * f1;
     
    	char adressefichiersurdisque [101];
     
    	printf("Entrer le nom et l'emplacement du fichier à créer : \n");
    	gets(adressefichiersurdisque);
    	f1 = fopen(adressefichiersurdisque, "w+b");
    	if (f1 == NULL)
    		{
    			printf("Impossible de créer le fichier\n");
    			printf("Appuyer sur une touche pour quitter\n");
    			getch();
    			exit(1);
    		}
     
    	int_fichier(f1); //le fichier original est initialisé, je dois redéfinir cette fonction mais comment ?
     
    	modifienom(f1);
    	fclose(f1);
     
    	system("PAUSE");
    	return 0;
     
    	}
     
     
     
    	void modifienom (FILE * f1) 
    	{
    	MEMBRE temp; //création de la variable temporaire
    	printf("Le nom va être modifiée\n");
    	fseek(f1,0,SEEK_SET);
    	fread(&temp, sizeof(MEMBRE),1,f1);
     
    		while (!feof(f1)) 
    		{
    		if (strcmp (temp.com, "club") == 0 )
    			{
    			strcpy(temp.com,"nom");
    			fseek(f1,-1 * sizeof(MEMBRE),SEEK_CUR);
    			fwrite(&temp, sizeof(MEMBRE),1,f1);
    			fseek(f1,0,SEEK_CUR);
    			}
    			fread (&temp, sizeof(MEMBRE),1,f1);
    		}
    		printf("Le nom a tété modifié\n");
     
    	}
     
     
     
     
     
    	void modifiecotisation;
     
    	MEMBRE tempcotisation;
    	fseek (f1,0,SEEK_SET);
    	printf("Réduction de 150 du montant de cotisation\n");
     
    		while fread (&tempscotisation, sizeof(MEMBRE), 1, f1, !feof(f1))
    		{
    			if ( (strcmp(tempcotisation.club,"LESMEILLEURS")) )
    			{
    			//je ne parviens pas à écrire un algorithme pour cette partie donc je sais pas quoi faire...
    			}
    		}

  2. #2
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 610
    Points : 1 534
    Points
    1 534
    Par défaut
    Hello,

    Une première chose à faire: bien présenter le 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <conio.h> //bilbio contenant la fonction getch()
    #include <stdio.h>
    #include <sdlib.h> 
    #include <string.h> //strcmp() et strcpy()
     
    void init_fichier(FILE *);
    void modifienom (char *);
    void modifieclub (char *);
     
    struct membre {
    	char nom [31], club[41];
    	int cotisation;
    };
    typedef struct membre MEMBRE;
     
    int main(int argc, char * argv[]) {
    	FILE * f1;
    	char adressefichiersurdisque [101];
     
    	printf("Entrer le nom et l'emplacement du fichier à créer : \n");
    	gets(adressefichiersurdisque);
    	f1 = fopen(adressefichiersurdisque, "w+b");
    	if (f1 == NULL) {
    		printf("Impossible de créer le fichier\n");
    		printf("Appuyer sur une touche pour quitter\n");
    		getch();
    		exit(1);
    	}
     
    	int_fichier(f1); //le fichier original est initialisé, je dois redéfinir cette fonction mais comment ?
    	modifienom(f1);
    	fclose(f1);
    	system("PAUSE");
    	return 0;
     
    }
     
    void modifienom(FILE * f1) {
    	MEMBRE temp; //création de la variable temporaire
    	printf("Le nom va être modifiée\n");
    	fseek(f1,0,SEEK_SET);
    	fread(&temp, sizeof(MEMBRE),1,f1);
     
    	while (!feof(f1)) {
    		if (strcmp (temp.com, "club") == 0 ) {
    			strcpy(temp.com,"nom");
    			fseek(f1,-1 * sizeof(MEMBRE),SEEK_CUR);
    			fwrite(&temp, sizeof(MEMBRE),1,f1);
    			fseek(f1,0,SEEK_CUR);
    		}
    		fread (&temp, sizeof(MEMBRE),1,f1);
    	}
    	printf("Le nom a tété modifié\n");
    }
     
    void modifiecotisation;
     
    	MEMBRE tempcotisation;
    	fseek (f1,0,SEEK_SET);
    	printf("Réduction de 150 du montant de cotisation\n");
    	while fread (&tempscotisation, sizeof(MEMBRE), 1, f1, !feof(f1)) {
    		if ( (strcmp(tempcotisation.club,"LESMEILLEURS")) )
    		{
    		//je ne parviens pas à écrire un algorithme pour cette partie donc je sais pas quoi faire...
    		}
    	}
    Et que penses--tu que fasse la ligne 56 ?
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour la remarque et les indentations... c'est super sympa.

    à la ligne 56, je désire faire appel à une fonction (appeler une table originale contenant le montant réel) pour pouvoir faire une réduction de 150 euros. Mais le problème est que tout ça reste flou pour moi et je ne parviens pas à comprendre par où commencer ni comment.

    EDIT : j'ai cherché sur le net et je me suis documenté dans des manuels mais ça ne me permet pas d'avancer (de m'apporter de nouvelles idées pour écrire un algo par exemple) donc je demande de l'aide à des internautes que j'espère m'éclairciront...

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 610
    Points : 1 534
    Points
    1 534
    Par défaut
    Re,-

    À la ligne 56, tu déclares une variable nommée modifiecotisation de type void. Si tu veux appeler une fonction, il faut écrire modifiecotisation(); comme tu l'as fait pour modifiernom();
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Re,-

    À la ligne 56, tu déclares une variable nommée modifiecotisation de type void. Si tu veux appeler une fonction, il faut écrire modifiecotisation(); comme tu l'as fait pour modifiernom();
    Salut, merci pour la remarque car cela m'a complètement échappé en effet j'aurai plutôt dû l'écrire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    void modifiecotisation(FILE * f1) {
     
    	MEMBRE tempcotisation;
    	fseek (f1,0,SEEK_SET);
    	printf("Réduction de 150 du montant de cotisation\n");
    	while fread (&tempscotisation, sizeof(MEMBRE), 1, f1, !feof(f1)) {
    		if ( (strcmp(tempcotisation.club,"LESMEILLEURS")) )
    		{
    		//je ne parviens pas à écrire un algorithme pour cette partie donc je sais pas quoi faire...
    		}
     
    }

    pourrais-tu me donner une piste pour m'aider à partir d'une refléxion ou d'un indice svp ? je demande cela car je pense avoir bien cherché à redéfinir dans les paramètres int_fichier(f1) (qui est le fichier original étant déjà initialisé, et que je dois redéfinir cette fonction)

  6. #6
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 610
    Points : 1 534
    Points
    1 534
    Par défaut
    Ce code ne compile pas.

    • La syntaxe du while est mauvaise
    • fread() ne prend que 4 paramètres, pas 5 comme tu l'écris


    Et le retour de strcmp() vaut 0 (zéro) si les deux chaines sont identiques.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Invité
    Invité(e)
    Par défaut
    Un grand merci pour ces 2 remarques Je vais y réfléchir et je reviens sur ce forum ce week-end pour partager les modifications que j'aurai apportées à mon code pour l'appel à la fonction void modifiecotisation(FILE * f1)

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par isset Voir le message
    Par contre, je suis très ouverte aux critiques constructives qui visent à m'aider pour ne plus faire les mêmes erreurs et donc m'améliorer...
    Tu peux remplacer
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct membre {
    	char nom [31], club[41];
    	int cotisation;
    };
    typedef struct membre MEMBRE;
    ... par ...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	char nom [31], club[41];
    	int cotisation;
    } MEMBRE;
    De plus on préfixe ses types par un "t_" pour les reconnaitre facilement à la lecture et les noms en majuscules sont conventionnellement réservés aux macros.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	char nom [31], club[41];
    	int cotisation;
    } t_membre;

    Ensuite même si ce type de structure...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fread(&temp, sizeof(MEMBRE),1,f1);
    while (!feof(f1)) {
    	... (traitement) ...
    	fread (&temp, sizeof(MEMBRE),1,f1);
    }
    ... fonctionne, feof() n'est pas faite pour ça. La fonction feof() est un indicateur qu'on utilise seulement quand le fichier n'est plus lisible, pour détecter si la fin de lecture est due au fait que le fichier a été totalement lu, ou à une autre raison (erreur d'accès, fichier disparu, etc).

    La bonne façon de traiter un fichier est de tester directement la fonction de lecture...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (fread(&temp, sizeof(MEMBRE), 1, f1)) > 0) {
    	... (traitement) ...
    }

    Eventuellement ensuite tu peux rajouter...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!feof(f1)) {
    	... (gérer l'erreur de lecture) ...
    }
    Et ce n'est pas interdit d'aérer...=> fread(&temp,sizeof(MEMBRE),1,f1) vs fread(&temp, sizeof(MEMBRE), 1, f1)...

    Ensuite je ne vois pas trop la raison de tous ces fseek(). Surtout quand dans certains cas tu te replaces au début (la fonction rewind() serait alors plus appropriée). Si c'est "pour être sûr" alors ce n'est pas une super idée car si tu te rates tu vautres tout ton fichier. La bonne méthode est de faire confiance à ton cerveau qui doit simuler dans ton esprit le code au fur et à mesure que tu l'écris et qui doit donc savoir en permanence où tu en es de ton fichier.
    Et si tu dois faire du fseek() (parce qu'à un moment tu dois aller ailleurs pour faire un traitement temporaire), alors il te faut...
    • mémoriser l'emplacement => ftell()
    • te déplacer (et faire ton traitement)
    • revenir à l'emplacement mémorisé (fseek())

    ... afin que le traitement soit transparent (on doit pouvoir l'enlever du code sans que cela change quoi que ce soit à la lecture du fichier).

    Citation Envoyé par isset Voir le message
    Je préviens d'avance s'il vous plait de ne pas venir me dire qu'il ne faut jamais utiliser une fonction blacklistée ou banni (ou tout ce que vous voulez) car c'est mon formateur qui me les impose et je suis donc obligée de les utiliser (donc il n'y aura hélas pas la fonction fgets à la place de gets même si c'est très con. Je n'y peux rien, c'est les études je dois passer par là...)
    Mouais. Encore un prof de C qui a probablement déjà fait du C mais qui ne connait pas le C... C'est de lui le while (!feof(f1))???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci Sve@r pour toutes ces remarques pertinentes

    Pour revenir à ce que j'ai tenté de réaliser ces derniers jours, c'est d'abord pour la consigne suivante :
    La réduction de 150 du montant de la cotisation pour tous les membres du club "LESMEILLEURS"
    J'aimerais sincèrement avoir un retour là-dessus svp car ce que je peux trouver dans la documentation ne suit pas la logique de mon formateur, comme par exemple le squelette suivant (donné au début de l'exercice) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fread(&temp, sizeof(MEMBRE),1,f1);
    while (!feof(f1)) {
    ... (traitement) ...
    fread (&temp, sizeof(MEMBRE),1,f1);
    }
    feof() n'est pas faite pour ça.
    et je suis d'accord avec Sve@r .

    Un retour svp pour cette première fonction ?

    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
     
    void modifiecotisation (FILE * f1) {
    MEMBRE tempcotisation;
    fseek (f1,0,SEEK_SET); //se positionner au début du fichier
     
    printf("Réduction de 150 du montant de cotisation\n");
     
    while (fread(&tempcotisation, sizeof(MEMBRE), 1, f1)) > 0) {
    //traitement
    if ( strcmp(&tempcotisation.nom, "LESMEILLEURS") == 0)
    {
    strcpy(&tempcotisation.nom, cotisation -150 ); //la réduction du montant de 150
     
    fseek(f,-1 * sizeof(ENREG), SEEK_CUR);
    fwrite(&tamp, sizeof(ENREG), 1, f);
    fseek(f,0,SEEK_CUR);
    }
    fread(&tempcotisation, sizeof(MEMBRE), 1, f1);
    return 0;
     
    }
     
     
     
    if (!feof(f1)) {
    //gérer l'erreur de lecture
    f1 = fopen("test.txt", "r+"); //lecture et écriture du fichier déjà créé
    }
     
    }




    mise à jour : mon code actuellement 'au complet' pour plus de clarté :

    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
     
     
    #include <conio.h> //bilbio contenant la fonction getch()
    #include <stdio.h>
    #include <sdlib.h>
    #include <string.h> //strcmp() et strcpy()
     
    void init_fichier(FILE *);
     
    void modifienom (char *);
    void modifieclub (char *);
     
    struct membre
    {
    char nom [31], club[41];
    int cotisation;
    } ;
     
    typedef struct membre MEMBRE;
     
    int main(int argc, char * argv[])
    {
    FILE * f1;
     
    char adressefichiersurdisque [101];
     
    printf("Entrer le nom et l'emplacement du fichier à créer : \n");
    gets(adressefichiersurdisque);
    f1 = fopen(adressefichiersurdisque, "w+b");
    if (f1 == NULL)
    {
    printf("Impossible de créer le fichier\n");
    printf("Appuyer sur une touche pour quitter\n");
    getch();
    exit(1);
    }
     
    int_fichier(f1); //le fichier original est initialisé, je dois redéfinir cette fonction mais comment ?
     
    modifienom(f1);
    fclose(f1);
     
    system("PAUSE");
    return 0;
     
    }
     
    void modifienom (FILE * f1)
    {
     
    //TO DO
     
     
    /*MEMBRE temp; //création de la variable temporaire
    printf("Le nom va être modifiée\n");
    fseek(f1,0,SEEK_SET);
    fread(&temp, sizeof(MEMBRE),1,f1);
     
    while (!feof(f1))
    {
    if (strcmp (temp.com, "club") == 0 )
    {
    strcpy(temp.com,"nom");
    fseek(f1,-1 * sizeof(MEMBRE),SEEK_CUR);
    fwrite(&temp, sizeof(MEMBRE),1,f1);
    fseek(f1,0,SEEK_CUR);
    }
    fread (&temp, sizeof(MEMBRE),1,f1);
    }
    printf("Le nom a tété modifié\n");
    */
    }
     
     
     
    void modifiecotisation (FILE * f1) {
    MEMBRE tempcotisation;
    fseek (f1,0,SEEK_SET); //se positionner au début du fichier
     
    printf("Réduction de 150 du montant de cotisation\n");
     
    while (fread(&tempcotisation, sizeof(MEMBRE), 1, f1)) > 0) {
    //traitement
    if ( strcmp(&tempcotisation.nom, "LESMEILLEURS") == 0)
    {
    strcpy(&tempcotisation.nom, cotisation -150 ); //la réduction du montant de 150
     
    fseek(f,-1 * sizeof(ENREG), SEEK_CUR);
    fwrite(&tamp, sizeof(ENREG), 1, f);
    fseek(f,0,SEEK_CUR);
    }
    fread(&tempcotisation, sizeof(MEMBRE), 1, f1);
    return 0;
     
    }
     
     
     
    if (!feof(f1)) {
    //gérer l'erreur de lecture
    f1 = fopen("test.txt", "r+"); //lecture et écriture du fichier déjà créé
    }
     
    }
    Dernière modification par Bousk ; 13/02/2023 à 19h08. Motif: rétablissement du message

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par isset Voir le message
    J'aimerais sincèrement avoir un retour là-dessus svp car ce que je peux trouver dans la documentation ne suit pas la logique de mon formateur, comme par exemple le squelette suivant (donné au début de l'exercice) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fread(&temp, sizeof(MEMBRE),1,f1);
    while (!feof(f1)) {
    	... (traitement) ...
    	fread (&temp, sizeof(MEMBRE),1,f1);
    }
    et je suis d'accord avec Sve@r .
    Je n'ai pas dit que cette façon de faire ne fonctionnait pas. Elle est plus lourde et plus complexe que de simplement tester fread() dans le while (et c'est pourquoi tu ne la vois nulle part) mais elle fonctionne.

    Citation Envoyé par isset Voir le message
    Un retour svp pour cette première fonction ?

    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
    void modifiecotisation (FILE * f1)  {
    MEMBRE tempcotisation;
    fseek (f1,0,SEEK_SET);  //se positionner au début du fichier
     
    printf("Réduction de 150 du montant de cotisation\n");
     
    	while (fread(&tempcotisation, sizeof(MEMBRE), 1, f1)) > 0) {
    		 //traitement
    	    	if ( strcmp(&tempcotisation.nom, "LESMEILLEURS") == 0)
       		{
           		strcpy(&tempcotisation.nom, cotisation -150 ); //la réduction du montant de 150
     
                  fseek(f,-1 * sizeof(ENREG), SEEK_CUR);
                  fwrite(&tamp, sizeof(ENREG), 1, f);
                  fseek(f,0,SEEK_CUR);
          		}
    	fread(&tempcotisation, sizeof(MEMBRE), 1, f1);
        	return 0;
     
    	}
     
    	if (!feof(f1)) {
    		 //gérer l'erreur de lecture
    		f1 = fopen("test.txt", "r+"); //lecture et écriture du fichier déjà créé
    	}
     
    }
    Ben... ton compilateur ne t'a pas donné des infos???

    Alors
    • la variable "cotisation" n'existe pas
    • si "cotisation" existe et est de type "int", alors on ne peut pas la passer à strcpy(). Si elle est de type char[] alors on ne peut pas lui appliquer un calcul "-150". Et de toute manière il me semble que la cotisation (qu'elle soit d'origine ou réduite de 150) n'a rien à foutre dans le membre "nom".
    • je ne pige pas le but de tes fseek(f,0,SEEK_CUR) (j'en ai déjà parlé)
    • pas de "&" devant les noms de tableaux, ce sont déjà des adresses
    • si la fonction retourne une valeur dans la boucle, alors elle s'arrête et donc quitte la boucle qui sert donc à que dalle
    • si la fonction retourne une valeur, alors elle s'arrête et donc les lignes qui suivent ne sont alors jamais exécutées
    • à propos des lignes qui suivent, je ne vois pas pourquoi la gestion de l'erreur amène à ouvrir de nouveau le fichier (qui n'a pas été fermé)
    • si la fonction est void, je ne vois pas pourquoi elle retourne 0


    Citation Envoyé par isset Voir le message
    mise à jour : mon code actuellement 'au complet' pour plus de clarté
    Alors pour plus de clarté, tu seras gentil de l'indenter correctement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 16
    Dernier message: 23/03/2021, 19h44
  2. Réponses: 4
    Dernier message: 29/03/2006, 09h22
  3. modifier une valeur dans une hash
    Par chaabane dans le forum Langage
    Réponses: 1
    Dernier message: 17/03/2006, 11h59
  4. Comment Lire une valeur à partir d'un fichier XML en C++?
    Par Hamdi Hedhili dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/12/2005, 11h09
  5. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 11h45

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