Probleme en C
hue_canabis
Messages postés
36
Date d'inscription
Statut
Membre
Dernière intervention
-
hue_canabis Messages postés 36 Date d'inscription Statut Membre Dernière intervention -
hue_canabis Messages postés 36 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
printf ("\n\tEntrez le nom du 1er canton:");
fgets(pcourant->nomducanton,sizeof(pcourant->nomducanton),stdin);
est-ce que je peux ecrire cette instruction avec un scanf?
si oui, alor pourquoi utilise t on le fgets?
printf ("\n\tEntrez le nom du 1er canton:");
fgets(pcourant->nomducanton,sizeof(pcourant->nomducanton),stdin);
est-ce que je peux ecrire cette instruction avec un scanf?
si oui, alor pourquoi utilise t on le fgets?
15 réponses
Salut,
Oui tu peux utiliser scanf, mais reproduire l'équivalent, il faudrait utiliser :
Si tu utilises %s à la place, il s'arrêtera au premier espace rencontré, contrairement à fgets.
J'ai mis 50 en dur en considérant buffer de taille 51. Si tu veux le rentrer sous forme variable, tu vas devoir utiliser des directives processeurs.
L'avantage de fgets est que c'est une fonction simple, sécurisée. scanf est vraiment très complexe comme fonction et on peut vite faire n'importe quoi comme :
Oui tu peux utiliser scanf, mais reproduire l'équivalent, il faudrait utiliser :
scanf("50%[\n]",buffer);
Si tu utilises %s à la place, il s'arrêtera au premier espace rencontré, contrairement à fgets.
J'ai mis 50 en dur en considérant buffer de taille 51. Si tu veux le rentrer sous forme variable, tu vas devoir utiliser des directives processeurs.
L'avantage de fgets est que c'est une fonction simple, sécurisée. scanf est vraiment très complexe comme fonction et on peut vite faire n'importe quoi comme :
scanf("%s",buffer);puisqu'aucun contrôle de la taille.
ok merci beaucoup
une autre question:
Chaine = strlen(pcourant->nomducanton);
pcourant->nomducanton[Chaine-1]=pcourant->nomducanton[Chaine];
pcourant->nomducanton[Chaine]='*';
voila un autre souci.
si je comprend bien, ici on enleve la derniere lettre ( etant le \0) de ma chaine et je l'associe a ma nouvelle chaine.
et j'ajoute une * a la place?
une autre question:
Chaine = strlen(pcourant->nomducanton);
pcourant->nomducanton[Chaine-1]=pcourant->nomducanton[Chaine];
pcourant->nomducanton[Chaine]='*';
voila un autre souci.
si je comprend bien, ici on enleve la derniere lettre ( etant le \0) de ma chaine et je l'associe a ma nouvelle chaine.
et j'ajoute une * a la place?
Non, pas exactement.
On enlève la dernière lettre (celle avant le \0) de ta chaîne et on y met le '\0'.
Donc si ta chaîne initiale est : aaa\0
Ta chaîne deviendra en mémoire : aa\0\0
Et on remplace le \0 orignal par une étoile. Ce qui donne : aa\0*
Mais la dernière instruction ne sert à rien puisque l'étoile est après le \0.
Ainsi si tu affiches, pcourant->nomducanton, tu auras : aa
On enlève la dernière lettre (celle avant le \0) de ta chaîne et on y met le '\0'.
Donc si ta chaîne initiale est : aaa\0
Ta chaîne deviendra en mémoire : aa\0\0
Et on remplace le \0 orignal par une étoile. Ce qui donne : aa\0*
Mais la dernière instruction ne sert à rien puisque l'étoile est après le \0.
Ainsi si tu affiches, pcourant->nomducanton, tu auras : aa
mais le probleme c'est que je veux sauvegarder cela.
en fait, j'ai plusieur fgets et scanf ( chaines et int melanger)
et j'aimerai les sauvegarder ds un fichier .txt de maniere que ds le fichier j'aurai:
blablabla*blablabla*blablabla*blablabla*
le premier blablabla etant mon premier fgets le 2eme etant le scanf par ex.
etc
en fait, j'ai plusieur fgets et scanf ( chaines et int melanger)
et j'aimerai les sauvegarder ds un fichier .txt de maniere que ds le fichier j'aurai:
blablabla*blablabla*blablabla*blablabla*
le premier blablabla etant mon premier fgets le 2eme etant le scanf par ex.
etc
Salut,
Une fois que tu as tes variables, t'as plus qu'à écrire dans ton fichier avec fprintf par exemple.
Attention dans tes chaînes lues avec fgets, il est possible que le \n soit stocké. Dans ce cas là, tu peux l'enlever et le remplacer par un \0, avec strchr.
Par exemple :
Une fois que tu as tes variables, t'as plus qu'à écrire dans ton fichier avec fprintf par exemple.
fp=fopen(...); fprintf(fp,"%s*%s*%s",chaine1,chaine2,chaine3); fclose(fp);fp=NULL;
Attention dans tes chaînes lues avec fgets, il est possible que le \n soit stocké. Dans ce cas là, tu peux l'enlever et le remplacer par un \0, avec strchr.
Par exemple :
#include <string.h> char *p=strchr(chaine1,'\n'); if(p!=NULL) *p='\0';
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
encore une question lol,
si je veux supprimer une ligne comme celle la ( cad ma chaine blablalba*blablabla*blablalba*)
commen je fait?
et si je veux modifier une de ces donnees ( cad le premier blablabla de ma premiere ligne)
comment je fait?
merci beaucoup
si je veux supprimer une ligne comme celle la ( cad ma chaine blablalba*blablabla*blablalba*)
commen je fait?
et si je veux modifier une de ces donnees ( cad le premier blablabla de ma premiere ligne)
comment je fait?
merci beaucoup
Si tu veux récrire par-dessus. Tu peux utiliser fseek(fp,taille,SET_CUR); avec taille, le nombre de caractères que tu as écrit dans le fichier. Dans ce cas, vaut mieux passer par sscanf puis écrire dans le fichier.
Si tu veux supprimer une ligne à un endroit quelconque, il faut récrire toutes les lignes à partir de celle qu'il faut supprimer (principe du décalage d'un tableau).
Si tu veux supprimer une ligne à un endroit quelconque, il faut récrire toutes les lignes à partir de celle qu'il faut supprimer (principe du décalage d'un tableau).
Le plus simple :
Tu ouvres ton fichier 1en lecture
Tu ouvres un autre fichier 2 en écriture
Tu lis le fichier 1 et copie dans fichier 2 (à moins qu'il s'agit de la ligne à ne pas copier).
Tu fermes les fichiers 1 et 2.
Et tu utilises la fonction rename pour renommer le fichier 2 en fichier 1.
Tu ouvres ton fichier 1en lecture
Tu ouvres un autre fichier 2 en écriture
Tu lis le fichier 1 et copie dans fichier 2 (à moins qu'il s'agit de la ligne à ne pas copier).
Tu fermes les fichiers 1 et 2.
Et tu utilises la fonction rename pour renommer le fichier 2 en fichier 1.
ok,
mais comment je peux copier la ligne 1 du fichier 2 au fichier 1 et ne pas copier la ligne 2, puis copier la ligne 3?
et finalement comment est-ce que je peux ( apres avoir renomme) vider le fichier 2 pr le reutiliser?
mais comment je peux copier la ligne 1 du fichier 2 au fichier 1 et ne pas copier la ligne 2, puis copier la ligne 3?
et finalement comment est-ce que je peux ( apres avoir renomme) vider le fichier 2 pr le reutiliser?
Salut,
et finalement comment est-ce que je peux ( apres avoir renomme) vider le fichier 2 pr le reutiliser?
Il ne faut pas confondre renommer un fichier et le copier. Si tu le renommes, l'ancien nom du fichier n'existe plus.
mais comment je peux copier la ligne 1 du fichier 2 au fichier 1 et ne pas copier la ligne 2, puis copier la ligne 3?
Avec un if. Par exemple, si tu ne veux pas copier une ligne commençant par '#', tu peux faire :
et finalement comment est-ce que je peux ( apres avoir renomme) vider le fichier 2 pr le reutiliser?
Il ne faut pas confondre renommer un fichier et le copier. Si tu le renommes, l'ancien nom du fichier n'existe plus.
mais comment je peux copier la ligne 1 du fichier 2 au fichier 1 et ne pas copier la ligne 2, puis copier la ligne 3?
Avec un if. Par exemple, si tu ne veux pas copier une ligne commençant par '#', tu peux faire :
#include <stdio.h> int main(void){ FILE *fp1=fopen("aa.txt","r"); FILE *fp2=fopen("aa.tmp","w"); char buf[250]; if(fp1==NULL){ fputs("Impossible d'ouvrir le fichier\n",stderr); return 1; } if(fp2==NULL){ fputs("Impossible de créer un fichier tampon\n",stderr); return 1; } while(fgets(buf,sizeof buf,fp1)){ if(buf[0]!='#') fputs(buf,fp2); } fclose(fp1);fp1=NULL; fclose(fp2);fp2=NULL; if(rename("aa.tmp","aa.txt")==-1){ fputs("Impossible de récrire sur le fichier\n",stderr); fputs("Les modifications sont dans le fichier tampon\n",stderr); } return 0; }
oui mais dans ce cas, il ne vas plus copier a partir de la ligne qui commence par #
mais moi j'ai encore des donnes apres cette ligne...
de plus, chaque lignes commence par un chiffre:
1#chaine*chaine*int*int#1
2#chaine*chaine*int*int#2
3#chaine*chaine*int*int#3
et je veux enlever que la 2eme ligne
d'apres vous je met a la place du # je met 2#
mais il ne vas pa copier la 3eme ligne aussi.
on peut pa faire ne pas copier de 2# juska #2 ??
mais moi j'ai encore des donnes apres cette ligne...
de plus, chaque lignes commence par un chiffre:
1#chaine*chaine*int*int#1
2#chaine*chaine*int*int#2
3#chaine*chaine*int*int#3
et je veux enlever que la 2eme ligne
d'apres vous je met a la place du # je met 2#
mais il ne vas pa copier la 3eme ligne aussi.
on peut pa faire ne pas copier de 2# juska #2 ??
il ne fau pa oublier que si je supprime ma 2eme ligne,
je doit decrementer ma 3eme ligne qui sera ma 2eme et ainsi de suite...
je doit decrementer ma 3eme ligne qui sera ma 2eme et ainsi de suite...
Salut,
Comme je t'ai dit, c'est à toi de rédiger ta condition. Moi je t'ai juste donné un exemple. A toi de t'adapter.
Par exemple, si le # est en deuxième position, tu regarderas la deuxième case du buffer et non la première.
il ne fau pa oublier que si je supprime ma 2eme ligne,
je doit decrementer ma 3eme ligne qui sera ma 2eme et ainsi de suite...
Dans ce cas, tu récupères le premier nombre (avec strtol) et tu l'incrémentes.
Comme je t'ai dit, c'est à toi de rédiger ta condition. Moi je t'ai juste donné un exemple. A toi de t'adapter.
Par exemple, si le # est en deuxième position, tu regarderas la deuxième case du buffer et non la première.
il ne fau pa oublier que si je supprime ma 2eme ligne,
je doit decrementer ma 3eme ligne qui sera ma 2eme et ainsi de suite...
Dans ce cas, tu récupères le premier nombre (avec strtol) et tu l'incrémentes.