begin process at 2012 05 28 14:32:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Autre

 > 

un bout de code à comprendre en c


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

un bout de code à comprendre en c

mardi 17 février 2009 à 17:58:00 | un bout de code à comprendre en c

Yanis1973

Bonjour;

je ne suis un pro de C ; mais j'ai besoin de comprendre de petit bout en C.
merci d'avance de votre aide.

yanis
voila mon code



    while (feof(fin1)==0 || feof(fin2)==0)
  {
     if(ficOrg) {
           strncpy(lin1a,&lin1[8],4);
           lin1a[4]=0;
           strncpy(lin2a,&lin2[8],4);
           lin2a[4]=0;
     } else
    
    
    
    
    {
           strncpy(lin1a,&lin1[0],5);
           lin1a[5]=0;
           strncpy(lin2a,&lin2[0],5);
           lin2a[5]=0;

           if (strcmp(lin2a, "II-LP") == 0 || strcmp(lin2a, "II-ED") == 0 ){
             i=j=0;
             for(k=7; k<24; k++)if(lin2[k]==';'&& i==0)i=k;
             strncpy(lin2as,lin2,i);
             lin2as[i] = 0;
             if (strcmp(lin2as, lin2as_old) == 0) {
                nbmulti = nbmulti+1;
                if(nbmulti > 10) erreur(6,"10");
                } else {
                if (multi==1) {
                  /* printf("Ecriture %s \n", lin2as_old); */
                   for(i=0;i<=nbmulti;i++) fputs(&tlp[i][0],fout);
                   multi=0;
                   }
                nbmulti = 0;
                strcpy(lin2as_old, lin2as);
                }
                strcpy(&tlp[nbmulti][0], lin2);
             }
     }
    
    
mardi 17 février 2009 à 22:15:38 | Re : un bout de code à comprendre en c

SebLinck

Ce que je comprend:

    while (feof(fin1)==0 || feof(fin2)==0)  // tant que l'on n'est pas a la fin du fichier fin1 ou fin2
  {
     if(ficOrg) {  // si Org > 0 ( Org est booléen ? entier ?)
           strncpy(lin1a,&lin1[8],4); // voir  [ Lien ]
           lin1a[4]=0// on positionne le caractère de fin de chaine après le dernier caractère copié dans lin1a           strncpy(lin2a,&lin2[8],4); //on copie 4 caractères de la chaine lin2[8] dans lin2a 
           lin2a[4]=0; // mieux vaut faire lin2a[4] = '\0'; pour positionner le caractère de fin de chaine. 

     } else // sinon
    
    
    
    
    {
           strncpy(lin1a,&lin1[0],5); // voir  [ Lien ]
           lin1a[5]=0; lin1a[4]=0; // Caractère de fin de chaine...

           strncpy(lin2a,&lin2[0],5);  // voir  [ Lien ]
           lin2a[5]=0; lin1a[4]=0;  // Caractère de fin de chaine...

           if (strcmp(lin2a, "II-LP") == 0 || strcmp(lin2a, "II-ED") == 0 )//SI la chaine lin2a est II-LP OU SI lin2a est II-ED

{              i=j=0; // pourquoi ne pas les avoir initialisé à leur déclarations 
             for(k=7; k<24; k++) // on incrémente k de 7 a 23 (ou 24 a vérifier )
      if (lin2[k]==';'&& i==0)i=k; // ATTENTION le fort n'execute que cete ligne ! 
             strncpy(lin2as,lin2,i);  // on copie donc de 7 puis 8 puis 9 puis .... 23 caractères si lin2k[7 .... 23] est ";"
             lin2as[i] = 0;// Caractère de fin de chaine
             if (strcmp(lin2as, lin2as_old) == 0) {  si la chaine lin2as et lin2as_old sont identiquent ( on sais pas d'ou elles sorteent ceus deux la .....)
                nbmulti = nbmulti+1; //on incrémente nbmulti 
                if(nbmulti > 10) erreur(6,"10"); // si nbmulti est égale à 11 on appel la fonction erreur -> (Cf définition)
                } else { //sinon
                if (multi==1) {  // si multi est égale à 1
                  /* printf("Ecriture %s \n", lin2as_old); */  on affiche sur la sortie standard la chaine lin2as_old
                   for(i=0;i<=nbmulti;i++) // on incrémente i de 0 à nbmulti
                     fputs(&tlp[i][0],fout); //on écrit le premier caractère de la chaine tlp[i] dans le fichier fout
                   multi=0; // ATTENTION on execute que cette ligne
                   }
                nbmulti = 0;
                strcpy(lin2as_old, lin2as); // on sauvegarde la chaine lin2as dans lin2as_old pour le provhain tour
                }
                strcpy(&tlp[nbmulti][0], lin2); // copie lin2 dans tlp[nbmulti]
             }
     }

Voilà, maintenant je vais faire mon petit commentaire :
Une belle dmonstration de l'importance de respecter deux règle simple:
une ligne de code = une ligne de commantaire
Nomer ses variables de façon a ce qu'elle soit compréhensible
(ce qui permet souvent de s'abstenir de suivre la première règle)


Cordialement,
Sébastien.
mercredi 18 février 2009 à 10:46:26 | Re : un bout de code à comprendre en c

Yanis1973

Merci Sébastien pour ton aide.
Si tu veux, à la base c'est un programme de comparaison de 2 fichiers,
en le testant j'ai l'impression qu'il me sort des résultat aléatoire.

voila  les fichiers en entrée

fich1 :
II-LP;35554  ;SGN     ;EN;2
II-LP;35554  ;SGN     ;EN;6
II-LP;35574  ;SGN     ;EN;4
II-LP;35574  ;SGN     ;EN;6

fich2:
II-LP;35554  ;SGN     ;EN;1
II-LP;35559  ;SGN     ;EN;7
II-LP;35574  ;SGN     ;EN;5
II-LP;35574  ;SGN     ;EN;0

fichier rélultat par le programme ""liste.tmp""
II-LP;35554  ;SGN     ;EN;1
II-LP;35559  ;SGN     ;EN;7
II-LP;35559  ;SGN     ;EN;7
II-LP;35559  ;SGN     ;EN;7
II-LP;35574  ;SGN     ;EN;5
II-LP;35574  ;SGN     ;EN;5
II-LP;35574  ;SGN     ;EN;0
II-LP;35574  ;SGN     ;EN;0



Alors que je m'attandais à  un fichier ce de type :

II-LP;35554  ;SGN     ;EN;1
II-LP;35559  ;SGN     ;EN;7
II-LP;35574  ;SGN     ;EN;5
II-LP;35574  ;SGN     ;EN;0

en gros une ligne modifiée dans le fich2 , elle doit etre reporter dans le fichier résultat.
une ligne modifiée dans le fich2 , il faut la reporté avec toutes les lignes (si y a plusieurs lignes de meme identifiant )(que la ligne modifé) dans fichier resultat.

et danc  je crois tte se passe dans la fonction recopie.!!!!
j'ai du mal sincérement
la je mets à ta disposition tt le code du programme. si t'es peux m'aider .

N.B pour complier ss unix    ==== >  make  main   ( le nom du programme est main.c)
                      pour exécuter ====>    main fich1 fich2 
      je mets les le main.c les 2 fichiers ds le meme répertoire pour faciliter les testes.


le code




#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* Parametres ajustables */
/* #define LIGNES_PAR_PAGE  60 */

/* declaration des fonctions */
int main(int, char **);
void verif(int, char **);
void recopie(char *, char *, char *);
void erreur(int, char *);

/* variables globales */
FILE *fin1, *fin2, *fout;
char fichout[100];
char fichin1 [100];
char fichin2 [100];
int app;

/* definition des fonctions */
int main(int argc, char * argv[])
{
verif(argc,argv);

if ((fin1=fopen(fichin1,"r")) == NULL) erreur(3,fichin1);
if ((fin2=fopen(fichin2,"r")) == NULL) erreur(3,fichin2);

if ((fout=fopen(fichout,"w")) == NULL)
    {fclose(fin1);fclose(fin2);
     erreur(4,fichout);
  }

recopie(fichin1, fichin2, fichout);
if (fclose(fout) != 0) erreur(5, fichout);
if (fclose(fin1) != 0) erreur(5, fichin1);
if (fclose(fin2) != 0) erreur(5, fichin2);

/* printf("\n\n %5d lignes ont ete copiees", nlignetot);*/

}

void verif(int argc, char **argv)
/*  verification des parametres  */
{
 int i,j,k,l,min,max;
 char arg[100];
 char c1,c2,c3;
 char lin[255];
 /* valeurs par defaut */

 strcpy(fichin1,"$$$$$$$");
 strcpy(fichin2,"$$$$$$$");
 strcpy(fichout,"$$$$$$$");
/*
 printf("les fichiers sont : %s, %s\n", fichin, fichout);
*/

 for (i=1; i<argc; i++)
  {strcpy(arg, argv[i]);
    if (arg[0] == '-' )
     switch (arg[1]) {
       case '?': erreur(6," ");
                 break;
       default : erreur(6,arg);
     }
     else {
     if ( strcmp(fichin1,"$$$$$$$") == 0 )
       strcpy(fichin1,arg);
     else {
       if ( strcmp(fichin2,"$$$$$$$") == 0 )
       strcpy(fichin2,arg);
       else
        {if ( strcmp(fichout,"$$$$$$$") == 0 )
           strcpy(fichout,arg);
         else
           erreur(6, "trop de nom de fichier");
        }
      }
    }
  }
 if ( strcmp(fichout,"$$$$$$$") == 0 )
   strcpy(fichout, "liste.tmp");
/*
 printf("les fichiers sont : %s, %s\n", fichin, fichout);
*/
}

void recopie(char *source1, char *source2, char *cible)
{
 char lin1[2255], lin2[2255], lin1a[100], lin2a[100], lin2as[100], lin2as_old[100];
 int page, ligne, i, j, k, l  ;
 int cmp, multi, nbmulti;
 int ficOrg, ficOrg2;
 char tlp[10][300];

 page=0; ligne=0; nbmulti=multi=0;
 strcpy(lin2as_old,"xxx");
 fgets(lin1,2255,fin1);
 fgets(lin2,2255,fin2);
 strncpy(lin1a,&lin1[2],6);
 lin1a[5]=0;
 if(strcmp(lin1a, "EN-OS") == 0) ficOrg=1; else ficOrg=0;
 strncpy(lin2a,&lin2[2],6);
 lin2a[5]=0;
 if(strcmp(lin2a, "EN-OS") == 0) ficOrg2=1; else ficOrg2=0;
 if (ficOrg != ficOrg2) erreur(8, "fichiers incoherents");
 while (feof(fin1)==0 || feof(fin2)==0)
  {
     if(ficOrg) {
           strncpy(lin1a,&lin1[8],4);
           lin1a[4]=0;
           strncpy(lin2a,&lin2[8],4);
           lin2a[4]=0;
     } else {
           strncpy(lin1a,&lin1[0],5);
           lin1a[5]=0;
           strncpy(lin2a,&lin2[0],5);
           lin2a[5]=0;

           if (strcmp(lin2a, "II-LP") == 0 || strcmp(lin2a, "II-ED") == 0 ){
             i=j=0;
             for(k=7; k<24; k++)if(lin2[k]==';'&& i==0)i=k;
             strncpy(lin2as,lin2,i);
             lin2as[i] = 0;
             if (strcmp(lin2as, lin2as_old) == 0) {
                nbmulti = nbmulti+1;
                if(nbmulti > 10) erreur(6,"10");
                } else {
                if (multi==1) {
                  /* printf("Ecriture %s \n", lin2as_old); */
                   for(i=0;i<=nbmulti;i++) fputs(&tlp[i][0],fout);
                   multi=0;
                   }
                nbmulti = 0;
                strcpy(lin2as_old, lin2as);
                }
                strcpy(&tlp[nbmulti][0], lin2);
             }
     }
     if (feof(fin1)==0 && feof(fin2)==0)
        {cmp= strcmp(&lin1[2], &lin2[2]);
         if (cmp != 0 && ficOrg) {
           if(strcmp(lin1a, lin2a) == 0) { /* mise à jour */
             fgets(lin1,2255,fin1);
             cmp=1;
             }
           }
         if (cmp != 0 && !ficOrg) {  /* si ligne modif : OK */
           if (strcmp(lin1a, lin2a) != 0) {
/* ordre = II-EM < II-PI > II-CJ < II-ST > II-LP > II-ED   */
             if(strcmp(lin1a, "II-PI") == 0 && strcmp(lin2a, "II-CJ") == 0) cmp= -1;
             if(strcmp(lin1a, "II-ST") == 0 && strcmp(lin2a, "II-LP") == 0) cmp= -1;
             if(strcmp(lin1a, "II-LP") == 0 && strcmp(lin2a, "II-ED") == 0) cmp= -1;
             }
           }
        }
     if (feof(fin1)==0 && feof(fin2)!=0)
        cmp= -1;
     if (feof(fin1)!=0 && feof(fin2)==0)
        cmp= +1;
     if (cmp ==0) {
       fgets(lin1,2255,fin1);
       fgets(lin2,2255,fin2);
     }
     if (cmp < 0) {
       if (ficOrg) {
/* si code unité de longueur variable, remplacer 14 par la position après le 3e ; */
         lin1[14] = '0';
         fputs(lin1,fout);
         }
       fgets(lin1,2255,fin1);
     }
     if (cmp > 0) {
       if (strcmp(lin2a, "II-LP") == 0 || strcmp(lin2a, "II-ED") == 0 ){
         multi=1;
       } else {
       fputs(lin2,fout);
       }
       fgets(lin2,2255,fin2);
     }
  }
                if (multi==1) {
                   /*printf("Ecriture %s \n", lin2as_old); */
                   for(i=0;i<=nbmulti;i++) fputs(&tlp[i][0],fout);
                   }

 /*
 printf("\n %5d lignes copiees de %s sur %s,ligne,source,cible);
 nlignetot=nlignetot+ligne;
 */
}

void erreur(int no, char *str)
{
 char *msg[] = {"nombre de parametres incorrect",
                "erreur de syntaxe",
                "fichier impossible a ouvrir",
                "fichier impossible a ouvrir ou a creer",
                "erreur a la fermeture du fichier",
                "les parametres connus sont: fic_in1 fic_in2 fic_out",
                "erreur conversion numerique",
                "fichier historique impossible a ouvrir",
                "nombre d'historique Langue/Education trop petit"};
 printf("\n *** %s : %s\n",msg[no-1],str);
 exit(1);
}








 



Cette discussion est classée dans : code, bout, strncpy, lin2a, lin1a


Répondre à ce message

Sujets en rapport avec ce message

rediriger la sortie standard [ par Gmrinfo ] J'utilise C++ builder. Je dois utiliser un bout de code écrit en c avec des printf et je voudrais que ca écrive vers par exempe un memo.Comment je peu [C] recherche caractere [ par GazGaz ] bonjourj'ai un bout de code qui me permet de chercher un caractere dans une phrase. Ce code me renvoie l'emplacement du premier carcactere.ex : "yop"a erreur en execution [ par marooh ] bonjour, j'ai ecrit un code qui à partir d'un fichier charge les données dans un arbre binaire de recherche. ça compile et tout mais en executant ça s SVP aide sur un code source [ par medslim2010 ] Bonjour, Bah pour mon cas, j'ai un projet d'une gestion d'une biblio avec une connexion BDD et une interface graphique ( moi j'opte plutot pour le Qt Question : Variables static/méthode static/initialisation [ par Inutqen ] Bonjour à tous, j'ai besoin d'un coup de main :) J'ai un petit soucis avec un code C++, je suppose que la réponse à ma question se trouve quelque par opnet 14.5 [ par radiarourou ] bonjour, mon projet est de déterminer un algorithme d'ordonnancement dans les réseaux wimax.la simulation va se faite par le simulateur opnet 14.5 ou compiler code matlab sous langage C [ par badsha ] bonjour, j'aimerai savoir s'il est possible de compiler un code matlab (code.m) en langage C sinon si il y a une commande matlab pour convertir le co Scanf vers commande System() [ par Nir3x ] Bonjour à tous le IDNautes, Je suis actuellement en train de programmer un petit logiciel de jeu, mais je n'arrive pas à récupérer des données qui so fonction avec un type file* [ par vercd7am ] Bonjour, j'ai ecrit quelques lignes de code pour pouvoir lire un fichier txt. [code=cpp]int main() { int c; FILE *fichier = NULL; fichi interface graphique mfc [ par infoYESMINE ] Salut j'ai un code c++ ( interface graphique ) qui contient un bouton "open image" et qui affiche cette image dans une nouvelle fenetre nommé "Origin


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,778 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales