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 :

Programmation : le C « enregistrement & fichiers » C


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Programmation
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Programmation

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Programmation : le C « enregistrement & fichiers » C
    j'ai résolu un exercice et je suis doutée sur la solution si vous acceptez bien sur m'aider c'est un programme c sur les enregistrement
    Nom : WhatsApp Image 2020-01-19 at 23.26.50.jpeg
Affichages : 2213
Taille : 233,7 Ko

    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
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*qst1*/
    typedef struct{
    	int jour;
    	int mois;
    	int annee;
    	int heure;
    	int minute;
    	int seconde;
    }date;
    typedef struct{
    	int idp;
    	int idm;
    	date dn;
    	char tp[1000];
    }puplication;
    void SaveNumberpublication(int nbp){
    	FILE* f=NULL;
    	f=fopen("Nbr_Pub.txt","w");
    	if(f!=NULL){
     
    	fprintf(f,"%d",nbp);
    	fclose(f);
    }
    }
    void readpub(puplication*p) 
    {
    	int i,nbp;
    	printf("Saisie d une publication\n");
    	printf("Entrer le nombre des publications:\t\n");
    	fflush(stdin);
    	scanf("%d",&nbp);
    	printf("Donner identifiant du publication:\n ");
    	fflush(stdin); 
    	scanf("%d",&p->idp);
    	printf("Donner identifiant du membre: \n");
    	fflush(stdin);
    	scanf("%d",&p->idm);
    	printf("Donner la date de naissance: ");
    	fflush(stdin);
    	scanf("%d %d %d",&p->dn.jour,&p->dn.mois,&p->dn.annee);  
    		printf("donner text de la publication" );
    		scanf("%s",&p->tp[1000]);
    	}
     
    void readnumberpub(int *nbp){
    FILE *f=NULL;
    f=fopen("NbrPub.txt","r");
    if(f!=NULL){
    		fscanf(f,"%d",nbp);
    	} else
    		printf("erreur d'ouverture ce fichier\n");
     
    	fclose(f);
    }
    void restorbup(int*t,int nbp){ 
    int i;
    for(i=1;i<nbp;i++){
    	FILE *f;
    	f=fopen("publication.bin","rb");
    	if(f==NULL){
    		puts("Impossible de restaurer la publication");
    	}else{
    		fread(t,sizeof(int),1,f);
    	}
    	printf("t[%d]=%0.d",i+1,*(t+i));
    	fclose(f);
    }
     
    }
    void displaypub(puplication p,int nbp){
    	int i,tp[1000];
    	printf("les information concerenant une publicaton\t\n");
    	printf("identifiant de la publication %d\n",p.idp);
    	printf("identifiant du membre est %d\n",p.idm);
    	for(i=0;i<3;i++){
    		printf("texte de publication est %d = \n",p.tp[1000]);
    	}
    	printf("Date de naissance:%d/%d/%d",p.dn.jour,p.dn.mois,p.dn.annee);
     
    }
    void sortpub(int* t,int idp){
    	int estTrie=1;
    	int c;
    	int i,j,index;
    	while(estTrie==1){
    		estTrie=0;
    	for(i=0;i<idp;i++){
    		index=i;
    		for(j=i+1;j<idp;j++){
    			if(*(t+j)<*(t+index)){
    			index=j;	
    			}
    		}
    		if(index!=i){
    			c =*(t+i);
    			*(t+i)=*(t+index);
    			*(t+index)=c;
    			estTrie=1;
    		}
    	}
    }
    }
    int dichosearch(int*t,int idp,int vp){
    	int i,f,d,m,pos=-1;
    	d=0;f=idp-1;
    	while(d!=f&&pos==-1){
    	m=(f-d)/2;
    	 if (vp>*(t+m)){
    		f=m;
    	}else{
    	d=m;
    	}
    	if(vp=*(t+m)){
    		pos=m;
    	}else
    		printf("la publication n'existe pas!!!\t\n");
    	}	
    }	
     
    int supermember( int*t,int nbp){
    	int i,idm=*(t+0),pgp=1000;
    	for(i=1;i<nbp;i++){
    		if(*(t+i)>pgp){
    			pgp=*(t+i);
    			idm=*(t+i);
    		}
    	}
    }
     
    int main(){;
    	int choix,idp ;
    	puplication p;
    	int nbp,idm,vp;
    	readnumberpub(&nbp);
    	int*t;
     
    	 do
    	 {
    	 	printf("\n***************Menu********\n");
    	 	printf(" pour remplire les information tous les publications cliquer sur :1\n");
    	 	printf(" pour afficher les information tous les publications cliquer sur :2\n");
    	 	printf(" pour trier cliquer sur :3\n");
    	 	printf(" pour rechercher dans la publication  cliquer sur :4\n");
    	 	printf(" pour afficher l'indentifiant du membre ayant publié le plus grand nombre de publication' cliquer sur :5\n");
    	 	printf(" pour quitter le programme cliquer sur :0\n");
    	 	scanf("%d",&choix);
    	 	switch(choix)
    	 	{
    	 		case 1:system("cls");
    			 	readpub(&p);
    			 	readnumberpub(&nbp);
    					break;
    	 		case 2:system("cls");
    			 	displaypub(p, nbp);
    					break;
     
    	 		case 3:system("cls");
    			 			sortpub(t,idp);
    			 			displaypub(p, nbp);
     
    					break;
     
    	 		case 4:system("cls");
    	 		printf("donner la valeur a chercher\n");
    	 		if(dichosearch(t, idp, vp)==-1){
    	 			printf("la valeur n'existe pas..");
    			 }else{
    			 	printf("la valeur se trouve a %d\n",dichosearch(t, idp, vp));
    			 }
    			 break;
    			 case 5:system("cls");
    			 	displaypub(p,supermember(t,nbp));
    			 	break;
    	 		default :
    			 		printf("choix invalide!");
    					 break;
     
    		 }
     
     
    	 }while(choix!=0);
    	 return 0;
    }

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Points : 718
    Points
    718
    Par défaut
    Bonsoir

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f=fopen("NbrPub.txt","r");
    if(f!=NULL){
    		fscanf(f,"%d",nbp);
    	} else
    		printf("erreur d'ouverture ce fichier\n");
    Pourriez-vous poster ce fichier ?

    2) Il y a un petit warning
    warning: '0' flag ignored with precision and ‘%d’ gnu_printf format [-Wformat=]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("t[%d]=%0.d",i+1,*(t+i));
    ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("t[%d]=%.d",i+1,*(t+i));

  3. #3
    Candidat au Club
    Femme Profil pro
    Programmation
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Programmation

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    D’accord pour les réponses sont correct 🙂
    voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void readnumberpub(int *nbp){
    FILE *f=NULL;
    f=fopen("NbrPub.txt","r");
    if(f!=NULL){
    		fscanf(f,"%d",nbp);
    	} else
    		printf("erreur d'ouverture ce fichier\n");
     
    	fclose(f);
    }

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    La fonction fclose n'a pas besoin d'être appelée si le fichier n'a pas été ouvert.
    De toute manière que crois-tu que cette fonction fasse avec un pointeur NULL ?

  5. #5
    Candidat au Club
    Femme Profil pro
    Programmation
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Programmation

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ui effectivement vous êtes sur c’est seulement un test où j’ai fait
    Pour les d’autres réponses est-ce que vous avez des remarques? Et mrc bcp

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par foetus Voir le message
    La fonction fclose n'a pas besoin d'être appelée si le fichier n'a pas été ouvert.
    De toute manière que crois-tu que cette fonction fasse avec un pointeur NULL ?
    C'est pire que "pas besoin": contrairement à free(NULL), fclose(NULL) n'est pas une no-op garantie, mais un comportement indéfini. Qui, sous Visual Studio >=2005, crashe.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Oumaima rd Voir le message
    Ui effectivement vous êtes sur c’est seulement un test où j’ai fait
    Pour les d’autres réponses est-ce que vous avez des remarques?
    1. Les jours, mois, hh, mm et ss étant de petits nombres, pas besoin de "int"
    2. Tous ces nombres (y compris l'année) étant positifs, tu peux préciser "unsigned".
    3. on ne fflushe jamais stdin => UB
    4. scanf("%s",&p->tp[1000]); t'es sûr que c'est comme ça qu'on saisit une chaine ?
    5. printf("t[%d]=%0.d",i+1,*(t+i)); écrire t[i] au lieu de *(t+i) sera tout aussi efficace (il est vrai qu'on dit qu'utiliser un pointeur à la place des crochets est plus rapide mais ça concerne un pointeur déjà positionné sur la bonne case ; et si tu lui mets toi-même l'opération d'indirection alors ça perd tout avantage) et plus lisible
    6. printf("texte de publication est %d = \n",p.tp[1000]); même remarque que 2 lignes plus haut plus l'inadéquation entre le format "%d" et la nature de la valeur attendue (une string). As-tu lu les remarques fournies par ton compilo plutôt que venir nous demander de refaire son travail ???

    Sinon tes fonctions de tri "semblent" correctes bien que la variable "estTrie" aurait plus de sens par rapport à l'algo si elle se nommait "estPasTrie" (ou alors si tu inversais "1" et "0")

    Citation Envoyé par Oumaima rd Voir le message
    Et mrc bcp
    Ca t'ennuierait de mettre tes mots en entier ou c'est juste pour faire semblant d'être poli ?

    Citation Envoyé par Médinoc Voir le message
    Qui, sous Visual Studio >=2005, crashe.
    Ouais mais 2005 aussi quoi

  8. #8
    Candidat au Club
    Femme Profil pro
    Programmation
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Programmation

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Désolé, si je vous dérange, c'est seulement que J'ai l'habitude de parler comme ça. Une autre chose. Si jvous avez trouver des erreurs que j'ai faites , c'est la première fois de ma vie que j'étudie la programmation. Je sais que la solution est pleine d'erreurs, nous apprenons à corriger nos erreurs, et merci beaucoup encore.
    S’il vous plaît vous pouvez m’expliquer comment je peux créer un tableau dynamique dans la mémoire dans la 8 question

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Les jours, mois, hh, mm et ss étant de petits nombres, pas besoin de "int"
    Tous ces nombres (y compris l'année) étant positifs, tu peux préciser "unsigned".
    Micro-optimisation prématurée.

    Par contre, je suis d'accord avec le reste de tes remarques, surtout sur l'utilisation des tableaux de caractères: Oumaima rd doit revoir son cours à ce sujet.

    Ouais mais 2005 aussi quoi
    2005 et toutes les versions qui l'ont suivi (c'est un crash volontaire via le "invalid parameter handler").

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Micro-optimisation prématurée.
    Pas du tout

    Déjà la norme ne précise pas si par défaut un entier est signé ou pas.
    Donc à cause de cette incertitude, si tu ne précises pas unsigned, tu peux considérer que tu perds la moitié de ton espace de valeurs.

    Édit : Les nombres non signés permettent de faire moins de tests (plus de test négatif). Certes cela peut-être considéré comme de l'optimisation (sans parler d'autres techniques comme par exemple/ éventuellement des décalages de bits pour calculer les multiplications/ divisions avec 1 multiple de 2), mais les tests sont aussi plus lisibles.

    Et de plus, c'est mieux de préciser unsigned parce que le compilateur peut t'avertir en cas de mélange signé/ pas signé (*). Parce que dans le cas d'opérations signés avec des non signés, tu peux avoir des surprises

    * : comme on parle d'une donnée temps (nombre de secondes depuis un epoch je pense), c'est bien d'avoir un indicateur/ moyen qui nous prévient lorsqu'on code n'importe quoi. On ne fera que très rarement des opérations, et toujours avec des données temps, et lorsqu'on passe en paramètre, qu'on nous prévienne lorsqu'on risque de perdre des valeurs.


    Sinon , je sais qu'une partie de la libc ne fait pas les tests NULL pour des questions d'optimisation (peut-être que ce n'est plus le cas ). Donc, je me méfie toujours des passages NULL et depuis le temps cela devient automatique de les éviter.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Oumaima rd Voir le message
    S’il vous plaît vous pouvez m’expliquer comment je peux créer un tableau dynamique dans la mémoire dans la 8 question
    malloc(n). Ca alloue n octets en mémoire et ça te renvoie l'adresse de début (ou NULL si l'allocation n'a pas pu se faire). Et comme l'allocation se fait en contigüe, l'adresse de début peut s'utiliser comme un tableau. Et comme cette zone mémoire est commune à tout ton programme, tu as parfaitement le droit d'allouer dans une fonction X et d'utiliser la zone allouée dans une fonction Y pourvu que Y connaisse l'adresse de cette zone.

    Exemple pour allouer 50 int et les remplir avec les 50 premiers entiers: int *tab=malloc(50 * sizeof(int)); for (unsigned short i=0; i < 50; i++) tab[i]=i; (bien évidemment il faut aussi tester tab != NULL).

  12. #12
    Candidat au Club
    Femme Profil pro
    Programmation
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : Maroc

    Informations professionnelles :
    Activité : Programmation

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ah oui j’ai compris maintenant merci 🙏 pour votre réponse

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/09/2005, 16h34
  2. Programme de copie de fichier en réseau
    Par Empty_body dans le forum Langage
    Réponses: 5
    Dernier message: 12/09/2005, 17h26
  3. Enregistrement Fichier
    Par TheGoldViking dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/04/2005, 17h32
  4. [LG]programme qui renomme des fichiers
    Par Ne0taku dans le forum Langage
    Réponses: 9
    Dernier message: 16/02/2005, 21h18
  5. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27

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