IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème C important pour moi


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Points : 6
    Points
    6
    Par défaut Problème C important pour moi
    Bonjour à tous, j'ai un gros souci de programmation.
    Voici donc mon problème:

    Mon interface lis dans un fichier A et je souhaiterais que dès qu'elle voit un CTRL/ (voir ci-dessous),

    PPRINT / LENGTH : 30.000000
    PPRINT / LENGTH_UNITS : MILLIMETER
    PPRINT / NOSE_RADIUS : 0.000000
    PPRINT / SIDE_WIDTH : 10.000000
    PPRINT / TOOL_MATERIAL : -
    TURRET / 20, OSETNO, 11 $$-> POUR SERTI L1.50
    $$-> CSYS / 1.0000000000, 0.0000000000, 0.0000000000, 0.0000000000, $
    0.0000000000, 1.0000000000, 0.0000000000, 0.0000000000, $
    0.0000000000, 0.0000000000, 1.0000000000, 0.0000000000
    CTRL/-330
    SPINDL / RPM, 2000.000000, CCLW
    RAPID
    GOTO / 10.2394372684, 0.0000000000, -6.1000000000


    Elle force la valeur du CTRL/ à 351.609 dans un fichier B (ici 330).


    Alors voici avec le code ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		while (   tableau[z-1] != EOF)                               {
                 tableau[z] = fgetc( fichier_A);                                  z++;                                                                   }                                                                     
            for (i = 0 ; i < (z - 6) ; i++)                                                                                             {
                    if (tableau[i] == 'C' && tableau[i+1] == 'T' && tableau [i+2] == 'R' && tableau [i+3] == 'L' && tableau [i+4] == '/' )
                        {
                            tableau [i+5] = '-' ;
                            tableau [i+6] = '3' ;
                            tableau [i+7] = '5' ;
                            tableau [i+8] = '1' ;
                            tableau [i+8] = '.' ;
                            tableau [i+9] = '6' ;
                            tableau [i+10] = '0' ;
                            tableau [i+11] = '9' ;
    ce qu'elle me sort dans mon fichier B:


    PPRINT / LENGTH : 30.000000
    PPRINT / LENGTH_UNITS : MILLIMETER
    PPRINT / NOSE_RADIUS : 0.000000
    PPRINT / SIDE_WIDTH : 10.000000
    PPRINT / TOOL_MATERIAL : -
    TURRET / 20, OSETNO, 11 $$-> POUR SERTI L1.50
    $$-> CSYS / 1.0000000000, 0.0000000000, 0.0000000000, 0.0000000000, $
    0.0000000000, 1.0000000000, 0.0000000000, 0.0000000000, $
    0.0000000000, 0.0000000000, 1.0000000000, 0.0000000000
    CTRL/-351.609INDL / RPM, 2000.000000, CCLW
    RAPID
    GOTO / 10.2394372684, 0.0000000000, -6.1000000000

    Mon problème est donc qu'elle commence à me remplacer les caractères dans la ligne du bas du fichier A , or, je souhaiterais que cette ligne : SPINDL... reste à la meme place que dans le fichier A.
    Aidez moi s'il vous plait!!

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    En travaillant caractère par caractère, tu te compliques la tache. Si ton texte de remplacement ne fait pas la même taille que le texte à remplacer, il n'est plus possible de charger intégralement le fichier en mémoire pour le modifier.

    Une solution simple à ton problème serait de travailler ligne à ligne, sans charger le fichier intégralement en RAM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <string.h>
     
     
    int main(void)
    {
     
        FILE *fa = fopen("toto.in", "r");
        FILE *fb = fopen("toto.out", "w");
     
        char buffer[1024];
     
        while (fgets(buffer, sizeof buffer, fa)) {
            if (strstr(buffer, "CTRL/")) {
                /* "CTRL/"  est dans buffer : on remplace la ligne par celle qui nous intéresse */
                fprintf(fb, "CTRL/-351.609\n");
            } else {
                /* autre ligne : on copie betement */
                fprintf(fb, buffer);
            }
        }
     
        fclose(fa);
        fclose(fb);
     
     
        return 0;
    }
    Attention, ce code est incomplet : il n'y a aucune vérification du bon déroulement des fonction fopen.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Je n'arrive pas à l'adapté à mon code!! Comment se fait - t -il??
    Je te joint mon code complet mabu, merci de me consacrer un peu de temps!
    Fichiers attachés Fichiers attachés

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par sulli7086 Voir le message
    Je n'arrive pas à l'adapté à mon code!! Comment se fait - t -il??
    Tu travailles en chargeant le fichier en entier dans la mémoire. Mon exemple travaille ligne à ligne.

    Si tu tiens absolument à travailler caractère à caractère, tu peux :
    • Repérer l'endroit où commence la chaine "CTRL/-300" (fonction strstr)
    • Décaler ton tableau du nombre de caractères que tu veux rajouter à partir de l'endroit trouvé (fonction memmove)
    • Remplacer les caratères en question (fonction memcpy)

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Je suppose que si je te demande de modifier directement mon code, tu m'envoie valser?? ^^

    Tu sais, je suis vraiment très débutant dans la programmation et mon entreprise attend beaucoup de moi (ou de toi)

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par sulli7086 Voir le message
    Je suppose que si je te demande de modifier directement mon code, tu m'envoie valser?? ^^
    Disons que ce n'est pas la philosophie du forum. De plus, si aider quelqu'un sur un point particulier peut être rapide, intégrer une solution à un code existant est plus complexe (vu la tête du code, très complexe).

    Voici un code qui s'adapte au premier post que tu as fait (la boucle while).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        FILE *fa = fopen("toto.in", "r");
        FILE *fb = fopen("toto.out", "w");
        int z = 0;
        char tableau[9999];
     
        while (tableau[z-1] != EOF) 
        {   
            tableau[z] = fgetc(fa);
            z++;
        }   
        {
            char motif_rech[] = "CTRL/-330";
            char motif_repl[] = "CTRL/-351.609";
     
            /* recherche du motif */
            char *p = strstr(tableau, motif_rech);
            if(NULL != p) {
                /* taille restant du tabelau */
                int taille_fin_fichier_A = strlen(p);
     
                /* décalage de la mémoire pour l'insertion du motif */
                memmove(p + strlen(motif_repl), p + strlen(motif_rech), taille_fin_fichier_A - strlen(motif_rech));
     
                /* rempalcement du motif */
                memcpy(p, motif_repl, strlen(motif_repl));
     
            }
        }
        fprintf(fb, tableau);
     
        fclose(fa);
        fclose(fb);
        return 0;
    }

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Ok! Mais c'est quand je compile que ca bugg!! On peut peut etre correspondre par mail car j'ai vraiment besoin de ce code! Ca serait vraiment sympa de ta part.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       int z = 0;
        char tableau[9999];
     
        while (tableau[z-1] != EOF) 
        {   
            tableau[z] = fgetc(fa);
            z++;
        }
    Il y a deux soucis majeurs :
    1) Lors de l'entrée dans la boucle, "z-1" vaut -1.
    2) EOF est un int (qui vaut généralement -1). Mais le tableau est un tableau de char.

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Jeroman, je t'en supplie! Mixe ces 2 codes de facon a ce que sa fonctionne! Mon examen arrive à grand pas!!

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne te rends pas du tout service. Tu n'auras pas toujours quelqu'un qui fera des codes à ta place. Imagine un jour d'examen, si on te demande de programmer quelque chose et si tu n'as pas appris le langage, tu feras comment ?

    J'ai légèrement modifié le code de mabu (réparation du bug, deux/trois tests et ajout d'une boucle en cas de plusieurs occurrences), chose que tu aurais certainement pu faire avec un peu d'huile de coude :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        FILE *fa = fopen("toto.in", "r");
        FILE *fb = fopen("toto.out", "w");
        char tableau[9999];
     
        if ( fa != NULL && fb != NULL )
        {
            {
                int z = 0;
                int valeur = 0 ;
                do
                {
                    valeur = fgetc(fa) ;
                    tableau[z] = valeur ;
                    z++;
                } while ( valeur != EOF ) ;
                tableau[z-1] = 0 ;
            }
            {
                char motif_rech[] = "CTRL/-330";
                char motif_repl[] = "CTRL/-351.609";
                char *p = tableau ;
     
                /* recherche du motif */
                while ( ( p = strstr(p, motif_rech) ) != NULL )
                {
                    /* taille restant du tabelau */
                    int taille_fin_fichier_A = strlen(p);
     
                    /* décalage de la mémoire pour l'insertion du motif */
                    memmove(p + strlen(motif_repl), p + strlen(motif_rech), taille_fin_fichier_A - strlen(motif_rech));
     
                    /* rempalcement du motif */
                    memcpy(p, motif_repl, strlen(motif_repl));
     
                }
            }
            fprintf(fb, tableau);
        }
     
        if ( fa != NULL )
        {
            fclose(fa);
            fa = NULL ; /* pas nécessaire dans ce contexte */
        }
        if ( fb != NULL )
        {
            fclose(fb);
            fb = NULL ; /* pas nécessaire dans ce contexte */
        }
     
        return 0;
    }

Discussions similaires

  1. problème algorithmique difficile pour moi
    Par torjancss dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/05/2014, 12h49
  2. [SP-2010] Important pour moi SVP
    Par netcien dans le forum SharePoint
    Réponses: 0
    Dernier message: 20/12/2012, 14h47
  3. problème d'import pour android
    Par pierreTarek dans le forum Android
    Réponses: 0
    Dernier message: 13/04/2012, 16h50
  4. JSF plugin et intégration (Important pour moi)
    Par santati dans le forum JSF
    Réponses: 4
    Dernier message: 09/10/2007, 17h12
  5. Réponses: 2
    Dernier message: 19/12/2006, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo