Forum Clubic

Un souci pour effacer un enregistrement + question - en C

salut, j’ai une fonction qui permet d’effacer un utilisateur de mon fichier. En realité, il n’est pas supprimé, son etat est mis à “non”. Voila le code :

void suppuser(void)
{
int ok;
int num;
int choix;
FILE *f;
suser user;
system("cls");
printf("Vous avez decide de supprimer un utilisateur du fichier.");

ok=afficheUser();

printf("Entrez l'indice de l'utilisateur a supprimer du fichier :");
scanf("%d",&num);

//si le num tapé n'est pas compris entre 1 et le nbre d'élèves ds le fichier=>erreur
	while(num<1 || num>ok)
  {
  	printf("\nNumero inexistant, recommencez svp :");
  	flushall();  	
  	scanf("%d",&num);
  	
  }
	num--;

	f=fopen("fichieruser.txt","r+");
	fseek(f,sizeof(user)*(num),SEEK_SET);//on se positionne a l'endroit voulu
	fread(&user,sizeof(user),1,f);//lecture du fichier
	
	printf("\n\n\nVous avez choisi de supprimer l'utilisateur %s\n\n",user.nom);

	printf("Etes vous sur(e) ?");
	printf("\n1: oui   2: non\nVotre choix :")
	scanf("%d",&choix);
	if(choix==1)
	{

  //printf("On va zaper l'user !");

  strcpy(user.etat,"non");
  fseek(f,sizeof(user)*(num),SEEK_SET);
  fwrite(&user,sizeof(user),1,f);//ecriture 
  fclose(f);//fermetrure
  printf("L'utilisateur a bien ete supprime\nTapez une touche pour retourner au menu");
  getch();
  menu();

	}
	else
	{
  menu();
	}
	


getch();
}

La variable ok reçoit le nombre d’utilisateur inscrit dans le fichier qui sont a l’état “oui”. Mais j’ai un souci. Par exemple, j’ai 7 personnes dans mon fichier.
Les 5 premiers à “oui”, la 6eme à “non”, et la 7eme à “oui”.
Donc quand j’affiche le tableau (grace a la fontion afficheUser(), il me donne un tableau avec 6 utilisateurs. Mais si je veux supprimer le 6eme, il me positionne sur le 6eme enregistrement du fichier qui est deja à non, et voila mon souci.
Je ne sais pas comment résoudre ce souci, quelqu’un pourrait’ il m’aider ?

Sinon ma question est : existe t il une fonction pour sortir d’un programme, j’utilise Microsoft C++, j’ai fais un truc mais ça marche pas vraiment :

void degage()
{
	system("cls");
	printf("Tapez pour quitter ...");	
	getch();

}

Merci d’avance

Salut,

Une possibilité pour ton programme est de maintenir un tableau en plus de ton fichier.
Le tableau contient une clé et un nom : le nom de l’utilisateur et la clé permet d’accèder au fichier.

Ainsi pour supprimer un utilisateur, il suffit de faire une recherche dans le tableau sur le nom et tu connais sa position dans le fichier et donc tu peux simplement le supprimer.

Pour quitter un programme en cas d’erreur, il y a la fonction exit(). Tu peux lui donner en paramètre en entier qui servira de code d’erreur.

La solution la plus basique qui me vienne à l’esprit, c’est de modifier ta fonction afficheUser.

En effet, à part te retrouner le nombre d’utilisateurs à “oui”, elle ne sert à rien :confused:

Si au lieu de te renvoyer le nombre d’utilisateur actifs, qui est inutilisable ici (mais peut-être pas ailleur), elle te renvoyait le nombre total d’utilisateurs, alors:

  • Tu vérifies dans ta boucle while que le numéro est valide
  • L’indice rentré correspond à la position réelle de ton utilisateur
  • Si l’utilisateur était inactif, rien ne t’empêche d’envoyer un message

Pourquoi ne pas stocker tout en mémoire directement? Surtout si ce n’est pas trop lourd?