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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    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
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    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
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    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;
    }

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