Suite de mes nombreux probleme ......

Suite de mes nombreux probleme ...... - C++ - Programmation

Marsh Posté le 28-08-2002 à 14:15:52    

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

Reply

Marsh Posté le 28-08-2002 à 14:15:52   

Reply

Marsh Posté le 28-08-2002 à 14:33:34    

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

Reply

Marsh Posté le 28-08-2002 à 14:44:30    

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.
 
 
 
 
 
 
 

Reply

Marsh Posté le 28-08-2002 à 14:48:25    

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]
Reply

Marsh Posté le 28-08-2002 à 14:52:15    

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

Reply

Marsh Posté le 28-08-2002 à 14:54:50    

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]
Reply

Marsh Posté le 28-08-2002 à 15:01:12    

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

Reply

Marsh Posté le 28-08-2002 à 15:34:03    

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


 
ca ne marche pas

Reply

Marsh Posté le 28-08-2002 à 15:42:53    

Qu'est ce qu'il te fait?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 28-08-2002 à 15:49:38    

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
Reply

Marsh Posté le 28-08-2002 à 15:49:38   

Reply

Marsh Posté le 28-08-2002 à 15:50:15    

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

Reply

Marsh Posté le 28-08-2002 à 15:53:10    

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'))

Reply

Marsh Posté le 28-08-2002 à 15:53:31    

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.

Reply

Marsh Posté le 28-08-2002 à 15:55:28    

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]
Reply

Marsh Posté le 28-08-2002 à 16:07:23    

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
Reply

Marsh Posté le 28-08-2002 à 16:12:42    

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]
Reply

Marsh Posté le 28-08-2002 à 16:25:15    

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
 
 

Reply

Marsh Posté le 30-08-2002 à 02:58:16    

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
Reply

Marsh Posté le 09-10-2002 à 10:00:48    

je laisse um chtit drapeau...  

Reply

Sujets relatifs:

Leave a Replay

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