probleme de modification de fichier texte urgent

probleme de modification de fichier texte urgent - C - Programmation

Marsh Posté le 16-06-2004 à 11:29:35    


 
donc dans les procedure de modification modifequipe  
 
lorsque je demande quelles informations voulez vous modifier, je saisis un chiffre  en fonction de l'info, puis je saisi l'information a laquelle il se rapporte .
 
Mais pour certaines informations g besoin d'utiliser les espaces, j'ai donc utilisé gets(enregistrement.champ) malheureusement je sais pas pourquoi mais il le reconnait pas ,g essayer scanf pr voir si je ne m'etait pas tromper autre part dans la selection et cela fonctionne mais je ne peut alors pas utiliser les espaces.donc ou j'utilise mal la synthaxe du gets ou le pb vient d'autre part.Je vous en serais reconnaissant si vous pouviez y jeter un coup d'oeil pour me renseigner merci d'avance  

Code :
  1. void modifequipe()
  2. {
  3.     int cpt;
  4. char name[40+1];
  5. char rep;
  6.     int choix;
  7.     system("cls" );
  8. printf("\n****************************************************************************\n\n\n" );
  9. printf("\t\t\t\tMODIFICATION DES EQUIPES\n" );
  10. printf("\n****************************************************************************\n\n\n" );
  11. printf ("\n\nsaisir le nom de l'equipe a modifier : " );
  12.     flushall();
  13. scanf("%s",&name);//saisie d'une chaine (s pour string)
  14.     if(existeequipe(name)==true)//verif de l'existence
  15.     {
  16.         cpt=compteequipe(name);//place de l'enregistrement
  17.         fichier_equipe=fopen("fequipe.txt","r+" );//ouverture en lecture-écriture
  18.         fseek(fichier_equipe,sizeof(enrequipe)*(cpt),SEEK_SET);//on positionne la lecture au niveau de la place de l'enr
  19.         fread(&enrequipe,sizeof(enrequipe),1,fichier_equipe);//la on lit l'enr trouver
  20.         printf("etes vous sur de vouloir modifier le client %s %s? o/n ",enrequipe.nom,enrequipe.prenom);
  21.         flushall();
  22.         rep=(char) getchar();
  23.  flushall();
  24.         if (rep=='o'|| rep=='O')
  25.         {
  26.             printf ("que voulez vous modifiez :\n\n" );
  27.             printf("\n1 Modifier le nom" );
  28.             printf("\n2 Modifier le prenom" );
  29.             printf("\n3 Modifier la date de naissance " );
  30.             printf("\n4 Modifier l'adresse" );
  31.             printf("\n5 Modifier le code postal" );
  32.             printf("\n6 Modifier la ville" );
  33.             printf("\n7 Modifier le numero de telephone 1" );
  34.             printf("\n8 Modifier le numero de telephone 2" );
  35.             printf("\n9 Modifier le numero de portable" );
  36.             printf("\n10 Modifier le numero de fax" );
  37.             printf("\n11 Modifier l'e-mail 1" );
  38.             printf("\n12 Modifier l'e-mail 2" );
  39.             printf("\n13 Modifier le role" );
  40.             printf("\n14 Modifier le statut" );
  41.             printf("\n15 Modifier les remarques " );
  42.             printf("\n Saisissez votre choix : " );
  43.             flushall();
  44.             scanf("%d",&choix);
  45.             switch(choix)
  46.             {
  47.                 case 1 : gets(enrequipe.nom);//pas de cote pr le choix car c du decimal et non du char
  48.                     break;
  49.                 case 2 : gets(enrequipe.prenom);
  50.                     break;
  51.                 case 3 : gets(enrequipe.naissance);
  52.                     break;
  53.                 case 4 : gets(enrequipe.adresse);
  54.                     break;
  55.                 case 5 : gets(enrequipe.cp);
  56.                     break;
  57.                 case 6 : gets(enrequipe.ville);
  58.                     break;
  59.                 case 7 : gets(enrequipe.tel1);
  60.                     break;
  61.                 case 8 : gets(enrequipe.tel2);
  62.                     break;
  63.                 case 9 : gets(enrequipe.portable);
  64.                     break;
  65.                 case 10 : gets(enrequipe.fax);
  66.                     break;
  67.                 case 11 : gets(enrequipe.email1);
  68.                     break;
  69.                 case 12 : gets(enrequipe.email2);
  70.                     break;
  71.                 case 13 : gets(enrequipe.role);
  72.                     break;
  73.                 case 14 : gets(enrequipe.statut);
  74.                     break;
  75.                 case 15 : gets(enrequipe.remarque);
  76.                     break;
  77.             }
  78.             fseek(fichier_equipe,sizeof(enrequipe)*(cpt),SEEK_SET);
  79.             //on se replace a l'endroit du fichier où se trouve le client
  80.             fwrite(&enrequipe,sizeof(enrequipe),1,fichier_equipe);
  81.             printf("fiche modifiee" );
  82.             fclose(fichier_equipe);
  83.         }
  84.     }
  85. }

Reply

Marsh Posté le 16-06-2004 à 11:29:35   

Reply

Marsh Posté le 16-06-2004 à 11:31:43    

scanf("%s",&name);//saisie d'une chaine (s pour string)
 
 
première ligne première erreur. et je ne te parle pas de remplacer scanf par fgets
 
 
 
    printf ("que voulez vous modifiez :\n\n" );
                    printf("\n1 Modifier le nom" );
                    printf("\n2 Modifier le prenom" );
                    printf("\n3 Modifier la date de naissance " );
                    printf("\n4 Modifier l'adresse" );
                    printf("\n5 Modifier le code postal" );
                    printf("\n6 Modifier la ville" );
                    printf("\n7 Modifier le numero de telephone 1" );
                    printf("\n8 Modifier le numero de telephone 2" );
                    printf("\n9 Modifier le numero de portable" );
                    printf("\n10 Modifier le numero de fax" );
                    printf("\n11 Modifier l'e-mail 1" );
                    printf("\n12 Modifier l'e-mail 2" );
                    printf("\n13 Modifier le role" );
                    printf("\n14 Modifier le statut" );
                    printf("\n15 Modifier les remarques " );  
 
 
 
un seul printf suffit
 
 
printf("ligne1\n"
    "ligne2\n"
 
etc
 
le cpp colle toutes les lignes

Reply

Marsh Posté le 16-06-2004 à 11:32:37    

fflushall() n'est pas standard. préfère fflush(stdout);
 
et y a pas de booléen en C

Reply

Marsh Posté le 16-06-2004 à 11:36:45    

elle est ou la faute a la premiere ligne?g mis %s c bon non?
si le truc booleen marche
puis pour la lisibilite g prefere ma solution pr le printf que celle sur une seul ligne.
bon en plus en c je debute donc bon on passe ca,moi mon pb c le gets ki me fait retourner a mon menu alors ki devrait saisir
 

Reply

Marsh Posté le 16-06-2004 à 11:46:47    

- si c'est pas le %s qui déconne, c'est que ça doit être à côté non ?
 
- bravo, tu utilises VC++
 
- la solution que je te propose est plus lisible, car tu économises des tas de "printf(  );"

Reply

Marsh Posté le 16-06-2004 à 11:50:52    

non car sa marche avec scanf
on ma parle de stdin
je v tester
et moi j'utilise sutout borland mais bon si je doit utiliser vsc++
c po grave

Reply

Marsh Posté le 16-06-2004 à 11:54:38    

Le scanf peut pas fonctionner là ...

Reply

Marsh Posté le 16-06-2004 à 12:00:34    

mais vla le boulet ca marche mais pas avec les espace c tout

Reply

Marsh Posté le 16-06-2004 à 12:09:46    

bon ecoutez arreter ede me parler de mon printf ou mon scanf, je veut juste prendre en compte les espaces merci de vous focaliser sur ca et non les pb booleen, ca fait deja une semaine ke je bosse sur cette erreur je suis a bout la!!!!!

Reply

Marsh Posté le 16-06-2004 à 12:16:00    

MDR ...  :lol:

Reply

Marsh Posté le 16-06-2004 à 12:16:00   

Reply

Marsh Posté le 16-06-2004 à 12:16:26    

ben tu vas continuer tout seul alors ... puisque tu ne veux pas écouter nos conseils

Reply

Marsh Posté le 16-06-2004 à 12:17:09    

lefauve a écrit :

mais vla le boulet ca marche mais pas avec les espace c tout

c'est vrai que t'as vachement d'expérience. je crois qu'en 30minutes, tout le monde peut en avoir autant

Reply

Marsh Posté le 16-06-2004 à 12:28:22    

non mais je critique pas vos connaisance mais bon je vs pose une question présice et vs me parlez de la mise en page ou des reponses a coté donc bon c normal ke sa me saoul c t pas pr vs vexer les gars

Reply

Marsh Posté le 16-06-2004 à 12:40:33    

on te dis que 1) ton scanf marche pas et plante 2) d'utiliser fgets 3) que les booléens existe pas en C

Reply

Marsh Posté le 16-06-2004 à 12:47:22    

le  scanf("%s",&name)?pk il marche pas, c chelou , moi il marche sur mon pc oui mais j'utilise c++ builder donc il reconnait le booléen puis je l'ait essayer , il marche, je sai je suis relou mais bon, a la limite explique moi pk ca marche pas ca m'interesse je sui ouvert a tt propos de toute facon

Reply

Marsh Posté le 16-06-2004 à 12:51:34    

1) tu ferais bien de réviser tes pointeurs
2) "ça compile" ne veut pas dire "ça marche". Revois ton C

Reply

Marsh Posté le 16-06-2004 à 12:56:20    

il est ou le probleme avec le pointeur?le programme se compile et fonctionne si je remplace le gets par scanf donc j'en ai deduit ke c t pas le scanf donc au lieu de me faire des critique gratuite explique moi ca sera plus rapide merci taz

Reply

Marsh Posté le 16-06-2004 à 12:58:49    

a la limite corrige le pg et balance ta soluce ca  m'avancera

Reply

Marsh Posté le 16-06-2004 à 13:26:54    

allez siouplait help me j'en ai marre

Reply

Marsh Posté le 16-06-2004 à 13:54:49    

utilise comme ça
 
char ligne[128];
 
fgets(ligne, sizeof ligne, stdin)

Reply

Marsh Posté le 16-06-2004 à 15:12:55    

et apres , je fait koi?je l'attribu a l'enregistrement en fonction du choix?

Reply

Marsh Posté le 16-06-2004 à 15:21:43    

?

Reply

Marsh Posté le 16-06-2004 à 15:30:14    

bah la ligne ke tu me fait declarer je la positionne ou?

Reply

Marsh Posté le 16-06-2004 à 15:36:59    

DTC
 
ben pour lire une ligne bordel :o

Reply

Marsh Posté le 16-06-2004 à 15:40:42    

faut ke je redeclare tout les enregistrement?ou je peut mettre ce qui sont dans ma structure?

Reply

Marsh Posté le 16-06-2004 à 15:42:31    

mais tu racontes quoi bordel ?

Reply

Marsh Posté le 16-06-2004 à 15:58:45    

bah je veut gerer des equipe, pouvoir en ajouter, en supprimer, en rechercher et  en modifier et tout garder sur un fichier txt.donc g fait ca:
FILE *fichier_equipe;
struct equipe
{
    char nom[50+1];
    char prenom[50+1];
    char naissance[15+1];
    char adresse [40 +1];
    char cp[12+1];
    char ville [50+1];
    char tel1[12+1];
    char tel2[12+1];
    char portable[12+1];
    char fax[12+1];
    char email1[55+1];
    char email2[55+1];
    char role [40+1];
    char statut[40+1];
    char remarque[100+1];
 
}enrequipe;
 
ensuite j'ajoute l'equipe comme ca:
void ajoutequipe ()
{
    char rep;
 rep='o';
 
do
{
    printf ("enregistrer une  équipe?" );
        flushall();
        rep = (char) getchar();
 
 
 
    if ((rep == 'o') || (rep == 'O'))
    {
        fichier_equipe = fopen("fequipe.txt","a+" );
        printf("saisir le nom de l'equipe:\n" );
        flushall();
        gets(enrequipe.nom );//nom de l'enregistrement.le champ
        printf ("saisir prenom: " );
        flushall();
        gets(enrequipe.prenom);
        printf ("saisir la date de naissance: " );
        flushall();
        gets(enrequipe.naissance);
        printf ("saisir l'adresse: " );
        flushall();//afin de liberer la memoire tampon
        gets(enrequipe.adresse);  
        printf("saisir le code postal :\n" );
        flushall();
        gets(enrequipe.cp);
        printf ("saisir la ville :\n" );
        flushall();
        gets(enrequipe.ville);
        printf ("saisir le telephone 1: " );
        flushall();
        gets(enrequipe.tel1);
        printf ("saisir le telephone 2: " );
        flushall();
        gets(enrequipe.tel2);
        printf ("saisir le numero de portable :\n" );
        flushall();
        gets(enrequipe.portable);
        printf("saisir le numero de fax  :\n" );
        flushall();
        gets(enrequipe.fax);
        printf("saisir l'e-mail 1 :\n" );
        flushall();
        gets(enrequipe.email1);
        printf("saisir  l'e-mail 2 :\n" );
        flushall();
        gets(enrequipe.email2);
        printf("saisir le statut : \n" );
        flushall();
        gets(enrequipe.statut);
        printf("saisir son role :\n" );
        flushall();
        gets(enrequipe.role);
        printf("saisir  des remarques :" );
        flushall();
        gets(enrequipe.remarque);
        fwrite (&enrequipe,sizeof(enrequipe),1,fichier_equipe);
        fclose (fichier_equipe);
 
    }
    else
  {
    system("cls" );//appelle la fonction du systeme ki
    menuequipe();//on retourne au menu des clients
  }
 }while((rep=='o')|| (rep == 'O'));//condition du fr tque
}
puis apres je veut modifier une ligne dans l'equipe, bah j'utilise ma fonction modifier du premier truc mais bon tjs le meme problem, kan je saisi le choix qui se rapport a l'information que je veut modifier par exemple l'adresse (enrequipe.adresse) si je saisi avec scanf,ca prend pas en compte les espaces, le gets il le reconnait plus, et je sait pas  comment utiliser fgets dans ce cas si.je te parle de la synthaxe exact bien sur.  

Reply

Marsh Posté le 16-06-2004 à 16:00:19    

balises [cpp] stp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-06-2004 à 16:04:03    

1) n'utilise pas flushall mais fflush(stdout)
2) utilise fgets à la place de gets. je t'ai donné un exemple. fgets(structurre.membre, sizeof structurre.membre, stdin)

Reply

Marsh Posté le 16-06-2004 à 16:04:48    

alors g modifier comme ca, ca marche mieux car ta soluce seul ne m'aider pas elle faisait la meme que le gets
donc j'ai mis au-dessus et en-dessous fflush(stdin)
donc ca avnce puisque ca enregistre mais moi je voulait qu'il le mette a la place,maintenant j'ai le fichier en double il est ou le pb?

Reply

Marsh Posté le 16-06-2004 à 16:05:22    

dsl ok

Reply

Marsh Posté le 16-06-2004 à 16:08:35    

si en fait elle fait com le get sla tienne

Reply

Marsh Posté le 16-06-2004 à 16:09:16    

c'est à dire ? tu veux les espace ou pas ?

Reply

Marsh Posté le 16-06-2004 à 16:09:44    

voui voui

Reply

Marsh Posté le 16-06-2004 à 16:11:29    

bon ben alors ça marche.
 
J'AI PAS DIT fflush(stdin)
 
MAIS fflush(stdout) :o
 
 
fflush(stdin) ne fait rien et rien du touts

Reply

Marsh Posté le 16-06-2004 à 16:18:49    

bah sur mon pg c le contraire mais maintenant je me retrouve avec enregistrement l'original et le modifier

Reply

Marsh Posté le 16-06-2004 à 16:34:53    

bon quand tu sauras t'exprimer, t'auras qu'à remonter ce sujet
 
et me dit pas "ouin c'est le contraire" je suis pas là pour te raconter des conneries. si ça foire, c'est pas là, c'est en amont dans ton programme
 
des printf + fflush(stdout) + fgets c'est une solution éprouvée depuis 20ans, tu vas pas nous dire que ça marche pas après une après midi de C

Reply

Marsh Posté le 16-06-2004 à 16:49:48    

BOn ecoute je ne fait que te dire ce qui se passe sur mon pc, j'en sait rien si c normal ou pas normal, que stdin marche mais ce que je sai c ke ta solution na pas d'effet dans mon programme donc pas la peine de t'enerver ou alors tu je l'ai juste mal place dans cette partis de mon code.en plus je sai pas pk tu me parle de printf la.
donc je l'ai place ici:
case 3:fflush(stdout);
       fgets(enrequipe.adresse,150,stdin);
break;
 
CA sa marche pas ensuite
case 3:fflush(stdout);
       fgets(enrequipe.adresse,150,stdin);
       fflush(stdout);  
break;
ca non plus
case 3:
       fgets(enrequipe.adresse,150,stdin);
       fflush(stdout);
break;
ca non plus.le seul truc ki fait qqch,c'est
case 3:
       fflush(stdin);
       fgets(enrequipe.adresse,150,stdin);
       fflush(stdin);
break;
c tout!!!j'y peut rien je v pas te dire ca marche alors que non.donc est-ce que je l'ai bien place ton fflush()
?

Reply

Marsh Posté le 16-06-2004 à 16:53:01    

Retire vite tes fflush(stdin) avant de te faire insulter.
 
Extrait de http://www.isty-info.uvsq.fr/~rume [...] 4.html#q_4 mais surtout présent dans le Kernighan & Ritchie :
 
14.4 Pourquoi ne jamais faire fflush(stdin) ?
La fonction fflush() a un comportement défini uniquement sur les flux ouverts en écriture tels que stdout. Il est possible que sur votre système, appliquer cette fonction à stdin soit possible, mais c'est alors une extension non standard. Le comportement est indéterminé, et imprévisible.

Reply

Marsh Posté le 16-06-2004 à 16:54:13    

ase 3:fflush(stdout);
       fgets(enrequipe.adresse,150,stdin);
break;  
 
 
ça marchera toujours sauf si avant t'as foutu le bronx avec tes flush à la con dans tous les sens, résultat, ton stdin est une vrai poubelle, y a de tout dedans.
 
alors tu vérifies toutes tes lectures en amont, tu fais bien des printf + fflush(stdout) + scanf/fgets, tu vérifies que scanf et fgets on bien réussi et ça marchera.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed