Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2328 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Suite de mes nombreux probleme ......

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Suite de mes nombreux probleme ......

n°203837
Lenoiche
Posté le 28-08-2002 à 14:15:52  profilanswer
 

je rappelle succintement ce que je dois faire
 
j'ai 2 fichiers en .txt , dans lequel les champs sont séparé par des ;
 
et dans un des fichiers il y a des champs vide donc il y a ;; (sans espace)
 
et  il faut que je prenne dans le 1er fichier , un champs ensuite dans le 2eme fichier chercher ou le champs est repete
 
et donc j tutilise cela  
 

Code :
  1. while ((strcmp(var1,var2))!=0)
  2.     {
  3.         getValeur(source2,var2)
  4.     }


 
var1 et var2 sont des tableaux contenant une chaine de caractere  
source2 est la variable de type FILE pointant vers le 2eme fichier.
 
et donc le pb c que la boucle sarrete lorsque dans le fichier 2 , le pointeur de lecture arrive sur une suite tel qu'on ai ;;
 
je ne sais pas trop comment faire

mood
Publicité
Posté le 28-08-2002 à 14:15:52  profilanswer
 

n°203849
Lenoiche
Posté le 28-08-2002 à 14:33:34  profilanswer
 

et j ai aussi un autre problem
 

Code :
  1. void getValeur(FILE *source,char *valeur)
  2. {
  3.     char lettre;
  4.     int i;
  5.     i=0;
  6.     while ((lettre=fgetc(source)) !=';')
  7.             {
  8.                 valeur[i]=lettre;
  9.                 i++;
  10.             }
  11.     valeur[i]='\0';
  12. }


 
j aimerais que la boucle while s arretes aussi qd il y a retour a la ligne mais la bocule :
 

Code :
  1. while ((lettre=fgetc(source)) !=(';' || '\n'))


 
ne fonctionne pas car il n y a rien dans mon fichier resultat

n°203862
Carbon_14
Posté le 28-08-2002 à 14:44:30  profilanswer
 

J'ai pas regardé le reste,mais c'est-y correct  
while ((lettre=fgetc(source)) !=(';' || '\n';)) ?
 
faudrait pas faire plutôt
 
lettre = fgetc(source);
(lettre != ';';) || (lettre != '\n';)
 
if (a != b ou a != d) mais pas if (a != (b ou d)).
Le (b ou d), c'est utile quand on veut faire une combinaison de bits, mais c'est pas cet opérateur.
 
 
 
 
 
 
 

n°203867
try58
Posté le 28-08-2002 à 14:48:25  profilanswer
 

Et puis il vaudrait mieux mettre && a la place du || parce que sinon ta boucle ne s'arretera jamais


Message édité par try58 le 28-08-2002 à 14:50:01

---------------
LOVE & PEACE !!! [:kirvel]
n°203870
Lenoiche
Posté le 28-08-2002 à 14:52:15  profilanswer
 

try58 a écrit a écrit :

Et puis il vaudrait mieux mettre && a la place du || parce que sinon ta boucle ne s'arretera jamais




 
ha bon ????
 
mais si je mets && ca voudrais dire que le caractere doit s arrete qd le caractere est egale a ; et a \n ???
or c impossible

n°203872
try58
Posté le 28-08-2002 à 14:54:50  profilanswer
 

Lenoiche a écrit a écrit :

 
 
ha bon ????
 
mais si je mets && ca voudrais dire que le caractere doit s arrete qd le caractere est egale a ; et a \n ???
or c impossible



Non justement! Ca veut dire que ta boucle continuera tant que lettre != ';' ET lettre != '\n'


---------------
LOVE & PEACE !!! [:kirvel]
n°203882
Lenoiche
Posté le 28-08-2002 à 15:01:12  profilanswer
 

try58 a écrit a écrit :

Non justement! Ca veut dire que ta boucle continuera tant que lettre != ';' ET lettre != '\n'
 




 
ha oui en effet autant pour moi :D

n°203929
Lenoiche
Posté le 28-08-2002 à 15:34:03  profilanswer
 

Code :
  1. lettre=fgetc(source);
  2. while ((lettre!=';') && (lettre!='\n'))


 
ca ne marche pas

n°203951
try58
Posté le 28-08-2002 à 15:42:53  profilanswer
 

Qu'est ce qu'il te fait?


---------------
LOVE & PEACE !!! [:kirvel]
n°203965
bb138
La vie est belle ...
Posté le 28-08-2002 à 15:49:38  profilanswer
 

Ben non ! Il vaut mieux faire :

Code :
  1. while (((lettre = fgetc(source)) != ';') && (lettre != '\n'))

Sinon tu ne prend que la premiere lettre et après tu boucle à l'infini !


Message édité par bb138 le 28-08-2002 à 15:50:22
mood
Publicité
Posté le 28-08-2002 à 15:49:38  profilanswer
 

n°203967
Lenoiche
Posté le 28-08-2002 à 15:50:15  profilanswer
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. char nom1[64]={0},nom2[64]={0},nom3[64]={0},c;
  4. FILE *fichier1,*fichier2,*fichier3;
  5. void ouverture(FILE **fichier,char *nom,char *attribut)
  6. {
  7. if ((*fichier = fopen(nom,attribut)) == NULL)
  8.         printf("ERREUR : impossible d'ouvrir le fichier %s .\n",nom);
  9.     else
  10.         printf("Fichier %s ouvert .\n",nom);
  11. }
  12. void espace(FILE *fichier,int vide)
  13. {
  14.     int i;
  15.     char c=' ';
  16.     for (i=1;i<=vide;i++)
  17.         fputc(c,fichier);
  18. }
  19. void getValeur(FILE *source,char *valeur)
  20. {
  21.     char lettre;
  22.     int i;
  23.     i=0;
  24.     while ((lettre=fgetc(source)) !=';')
  25.     {
  26.          valeur[i]=lettre;
  27.          i++;
  28.     }
  29.     valeur[i]='\0';
  30. }
  31. void setValeur(FILE *resultat,char *valeur,int format)
  32. {
  33.     fputs(valeur,resultat);
  34.     espace(resultat,format-strlen(valeur));
  35. }
  36.        
  37. void constante(FILE *resultat,char *cons)
  38. {
  39.     fputs(cons,resultat);
  40. }
  41. void ligne(FILE *source1,FILE *source2,FILE *resultat)
  42. {
  43.     char var1[128],var2[128]={0};
  44.    
  45.     espace(resultat,7);                         //ANODOS//
  46.     constante(resultat,"10590" );                //ACNOCL//
  47.     getValeur(source1,var1);     
  48.     setValeur (resultat,var1,20);                //AREFCL//  
  49.     constante(resultat,"11" );                    //ACAPDE//
  50.     getValeur(source1,var1);
  51.     setValeur(resultat,var1,30);                 //ANOMDE//
  52.     espace(resultat,30);                         //AENSEI//
  53.     getValeur(source2,var2);
  54.     setValeur(resultat,var2,30);                 //ANRUE1//
  55.     getValeur(source2,var2);
  56.     setValeur(resultat,var2,30);                 //ANRUE2//
  57.     getValeur(source2,var2);
  58.     setValeur(resultat,var2,30);                 //ANRUE2//
  59. }
  60.    
  61.          
  62. main()
  63. {
  64.     printf("Entrez le nom du fichier source :\n" );
  65.     scanf("%s",nom1);
  66.     ouverture(&fichier1,nom1,"r" );
  67.     printf("\n" );
  68.    
  69.     printf("Entrez le nom du fichier source :\n" );
  70.     scanf("%s",nom2);
  71.     ouverture(&fichier2,nom2,"r" );
  72.     printf("\n" );
  73.    
  74.     printf("Entrez le nom du fichier destination :\n" );
  75.     scanf("%s",nom3);
  76.     ouverture(&fichier3,nom3,"w" );
  77.  
  78.    
  79.     ligne(fichier1,fichier2,fichier3);
  80.  
  81.    
  82. }


 
j ai 2 fichiers .txt comprenant des champs separés par des ;
je prends les champs dont j ai besoin et je les palce dans un 3eme fichier .txt
 
mais dans un des fichiers il y a des champs vide et donc ca merde lorsque je lit un champs vide , c a d qd dans le fichier il rencontre ;;

n°203976
Lenoiche
Posté le 28-08-2002 à 15:53:10  profilanswer
 

BB138 a écrit a écrit :

Ben non ! Il vaut mieux faire :

Code :
  1. while (((lettre = fgetc(source)) != ';') && (lettre != '\n'))

Sinon tu ne prend que la premiere lettre et après tu boucle à l'infini !




 
ca marche thx
 
mais je comprends pas pq ca ca  marchais pas
 

Code :
  1. lettre=fgetc(source);
  2. while ((lettre!=';') && (lettre!='\n'))

n°203978
Carbon_14
Posté le 28-08-2002 à 15:53:31  profilanswer
 

Dans une boucle, cela permettrait d'avoir un caractère frais à chaque fois
 
do
{
 lettre=fgetc(source);  
} while ((lettre != ';';) && (lettre!='\n';))
 
Ne pas oublier de tester EOF ..
 
Exemple de fgetc()
int ch;
   do
   {/* read a char from the file */
      ch = fgetc(stream);
    /* display the character */
      putch(ch);
   } while (ch != EOF);
 
Si j'ai le temps plus tard, je regarde de + près.

n°203983
try58
Posté le 28-08-2002 à 15:55:28  profilanswer
 

Lenoiche a écrit a écrit :

 
 
ca marche thx
 
mais je comprends pas pq ca ca  marchais pas
 

Code :
  1. lettre=fgetc(source);
  2. while ((lettre!=';') && (lettre!='\n'))






Parce que lettre ne change pas!


---------------
LOVE & PEACE !!! [:kirvel]
n°204002
Lenoiche
Posté le 28-08-2002 à 16:07:23  profilanswer
 

try58 a écrit a écrit :

 
Parce que lettre ne change pas!




 
moi pas comprendre ............ :sweat:


Message édité par Lenoiche le 28-08-2002 à 16:08:02
n°204007
try58
Posté le 28-08-2002 à 16:12:42  profilanswer
 

Lenoiche a écrit a écrit :

 
 
moi pas comprendre ............ [:sweet]
 




En fait quand tu fais ton fgetc(...) tu remplies lettre une premiere fois. Ensuite tu rentres dans ta boucle while().
Mais tu n'en ressors que si lettre est egale a ';' ou '\n'.
Or imaginons que la lettre vaut 'b', tu ne sortira jamais de ta boucle while puisque lettre vaudra toujours 'b'.
Tu es oblige de refaire un fgetc() pour chaque iteration de ta boucle while.
J'ai ete assez clair?


Message édité par try58 le 28-08-2002 à 16:13:32

---------------
LOVE & PEACE !!! [:kirvel]
n°204020
Lenoiche
Posté le 28-08-2002 à 16:25:15  profilanswer
 

ha oui en effet  
compris 5/5
:jap:
 
merchi a tt le monde mon programme a l air de tourner correctement .
 
je le posterais qd j aurais finis pour que vous rigoliez :P
 
 

n°205271
Musaran
Cerveaulté
Posté le 30-08-2002 à 02:58:16  profilanswer
 

Pour la copie de champ:
 
Version claire

Code :
  1. void getValeur(const FILE *const source,char *const valeur){
  2. int i;
  3. for(i= 0;;i++){
  4.  int lettre; //int et non pas char !
  5.  lettre= fgetc(source);
  6.  if(lettre==EOF ) break; //fin de fichier
  7.  if(lettre==';' ) break; //fin de champ
  8.  if(lettre=='\n') break; //fin de ligne
  9.  valeur[i]= lettre;
  10. }
  11. valeur[i]='\0';
  12. }


Version compactée

Code :
  1. void getValeur(const FILE *const source,char * valeur){
  2. for(;;valeur++){
  3.  int lettre= fgetc(source);
  4.  if(lettre==EOF || lettre==';' || lettre=='\n') break;
  5.  *valeur= lettre;
  6. }
  7. *valeur= '\0';
  8. }


Version trop compactée

Code :
  1. void getValeur(const FILE *const source,char * valeur){
  2. int lettre; //int et non pas char !
  3. for(; (lettre= fgetc(source)!=EOF) && lettre!=';' && lettre!='\n'); valeur++){
  4.  *valeur=lettre;
  5. }
  6. *valeur= '\0';
  7. }


Version vraiment illisible

Code :
  1. void getValeur(const FILE *const source,char * valeur){
  2. int lettre; //int et non pas char !
  3. for(; (lettre= fgetc(source)!=EOF) && lettre!=';' && lettre!='\n'); *valeur++=lettre);
  4. *valeur= '\0';
  5. }

Il est nécessaire que lettre soit un int pour pouvoir représenter EOF.
 
 
Possibilité pour la fonction espace:

Code :
  1. void espace(FILE *fichier,int vide){
  2. int fprintf(fichier, "%.*",vide,' ' );
  3. }


 
Pour la comparaison:

Code :
  1. for(;;){
  2. getValeur(source2,var2);
  3. if( strlen(var2,"" )!=0 )
  4.  if( strcmp(var1,var2)!=0 )
  5.   continue ;
  6. }


Ou comme ça:

Code :
  1. do{
  2. getValeur(source2,var2);
  3. }while( strlen(var2,"" ) && strcmp(var1,var2) );


J'ai mis getValeur en tête pour éviter d'avoir à en faire un avant la boucle, ce que je suppose que tu fais.


Message édité par Musaran le 30-08-2002 à 03:00:05

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°225433
Le_Chab
Posté le 09-10-2002 à 10:00:48  profilanswer
 

je laisse um chtit drapeau...  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Suite de mes nombreux probleme ......

 

Sujets relatifs
textarea ds bloc div ... (suite)Au secours problème sur excel
Probleme d'un newbie en php ( forum )un autre probleme se pose .......
Problème pour insertion smileys dans texterea (mozilla + netscape)[rapport de stage] Problème de traduction
[tableaux] probleme facile en CAidez moi SVP : Probleme con avec SDL (Langage C multimedias) !
[ PHP ] Problème pour trouver la librairie GD ?Problème d'activation de boutons dans VB6.0
Plus de sujets relatifs à : Suite de mes nombreux probleme ......


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR