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   -
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?

15 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
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.
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
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';
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
super super super,

merci beaucoup
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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).
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
ok, je vois l'idee, mais ce sera quoi comme fonction a utiliser?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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.
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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 :

#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;
}

0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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 ??
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
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...
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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.
0
hue_canabis Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
pouvait vous me passez votre mail msn,

j'aimerai vous parler mais ce sera tro long sur le forum.

apres avoir fait ce que vous m'aviez dit je recoi des warnings, et mon prog crash.
0