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 :

[nouveau] usage strcmp et getc


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut [nouveau] usage strcmp et getc
    je reformule mon problème pour ceux qui pourrai m'aider:

    J'ai ecrit un programme qui entre en parametre deux fichiers txt et une valeur numerique

    Je compare ligne par ligne les fichiers et j'affiche dans un fichier les lignes ou il y a difference.
    En plus je verifie lorsqu'il y a difference si le caractere lu est une valeur numerique et alors je m'assure que l'ecart est inferieur à la valeur donnée en paramètre.

    Mon code qui suit ne m'indique pas d'erreur à la compilation mais il ne fait pas ce que je veux.
    Je suis débutant veuillez excuser mes imprecisions et erreurs

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    void retrait_blanc (char* chaine, char cible[]);
    void traitement_fichiers(char* filename1, char* filename2,char* delta);
    char* formater_valeur (char* token);
    int traitement_valeurs (int valeurs1, int valeurs2,float precision);
    int traitement_ligne (char* ligne, float valeurs[]);
     
    #include "Diff_txt.h"
     
     
    #define BUFFSIZE 256
    #define OK 0
    #define KO 1
     
    //recuperation des fichiers et du delta
    void main(int argc, char** argv){
     
    	if(argc != 4)
    		printf("Usage: <%s> <file1> <file2> <DELTA> \n", argv[0]);
    	else
    		traitement_fichiers(argv[1], argv[2], argv[3]);
    }
     
    //si le caractere different est un chiffre comparer l'ecart à delta
    int traitement_valeurs (int valeurs1, int valeurs2, float precision) {
    	if(valeurs1 == valeurs2){
    		return OK;
    	}
    		else if (((valeurs1 - valeurs2)||(valeurs2 - valeurs1)) <= precision	
    		&&
    			  (((valeurs1 - valeurs2)/valeurs1) <= precision)){
    			return OK;
    		}
     
    		return KO;	
    }
     
    //épurer les lignes des fichier en supprimant tous les blancs
    void retrait_blanc (char* chaine, char cible[]){
        int i=0, j=0;
    	for (i = 0; i < (int)strlen(chaine); i++){
    		if(chaine[i] != ' ')
    			cible[j++] = chaine[i];
    	}
     
    	cible[j] = '\0';
    }
     
     
    void traitement_fichiers(char* filename1, char* filename2, char* delta){
    	int k = 0;
    	char buf1[BUFFSIZE];
    	char buf2[BUFFSIZE];
    	char ligne1[BUFFSIZE];
    	char ligne2[BUFFSIZE];
    	char courant1;
    	char courant2;
    	FILE *file1 = NULL;
    	FILE *file2 = NULL;
    	FILE *file3 = NULL;
    	float precision=atof(delta);
     
    	if((file1 = fopen(filename1, "r")) == NULL)	{
    		fprintf(stderr, "Erreur à l'ouverture du fichier <%s>\n", filename1);
    		exit(1);
    	}
    	if((file2 = fopen(filename2, "r")) == NULL){
    		fprintf(stderr, "Erreur à l'ouverture du fichier <%s>\n", filename2);
    		exit(1);
    	}
     
     
    	do{	
    		fgets(buf1,BUFFSIZE, file1); 
    		fgets(buf2,BUFFSIZE, file2);
     
    		k++; //pour le numero de ligne
    		retrait_blanc (buf1, ligne1);
    		retrait_blanc (buf2, ligne2);
     
    		if(strcmp(ligne1, ligne2) != 0) {
     
    			if((file3 = fopen("resultat", "a")) == NULL) {
    					fprintf(stderr, "Erreur à l'ouverture du fichier resultat\n");
    					exit(1);
    			}
     
    			if (isalpha(courant1 = getc(file1))==0  &&	isalpha(courant2 = getc(file2))==0){
     
    				if(traitement_valeurs (courant1, courant2, precision) == KO) {
     
    						fprintf(file3, "%s(ligne %d):\t%s\n", filename1, k, buf1);
    						printf("%s(ligne %d):\t%s\n", filename1, k, buf1);
    						fprintf(file3, "%s(ligne %d):\t%s\n", filename2, k, buf2);	
    						printf("%s(ligne %d):\t%s\n", filename2, k, buf2);
    				}
    			}
     
    			buf1[0]='\0';buf2[0]='\0';
    			ligne1[0]='\0';ligne2[0]='\0';
    		}
     
    	}
    	while(!feof(file1) && !feof(file2));
     
    	fclose(file1);
    	fclose(file2);
    	fclose(file3);
    }

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il faut qu'on compile le code et qu'on track les bugs ?

    Tu n'as pas réussi à localiser la partie ( petit bout de code) qui poserait probléme ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    En fait le code n'indique aucune erreur à la compilation, le fichier resultat est produit mais il est toujours vide

    Je me dis qu'il s'agit peut être d'une erreur dans mon raisonnement et que quelqu'un de plus avertit pourrai pister l'erreur plus facilement??

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [nouveau] usage strcmp et getc
    Citation Envoyé par Nalido
    J'ai ecrit un programme qui entre en parametre deux fichiers txt et une valeur numerique

    Je compare ligne par ligne les fichiers et j'affiche dans un fichier les lignes ou il y a difference.
    En plus je verifie lorsqu'il y a difference si le caractere lu est une valeur numerique et alors je m'assure que l'ecart est inferieur à la valeur donnée en paramètre.
    Donne un exemple de fichiers de données avec le résultat attendu.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    supposns que dans fichier 1 se trouve la phrase suivante:
    Nous sommes 15 sur le forum
    que dans le fichier 2 se trouve la phrase:
    Nous sommes 16 sur le forum

    les parametres de mon pgme sont fichier1 fichier2 delta=0.1

    alors le fichier resultat doit afficher les deux lignes car

    -il y a une difference de caractere
    -le caractere different etant un chiffre il a verifier que l'ecart etait plus grand que delta donc il affiche la ligne.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    Quand j'utilise le debugger je m'apercois qu'il detecte l'erreur mais il stok pas les lignes dans le fichier??

    Quelqu'un peut il m'aider là je suis bloqué...

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [nouveau] usage strcmp et getc
    Citation Envoyé par Nalido
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (((valeurs1 - valeurs2)||(valeurs2 - valeurs1)) <= precision   
          &&
               (((valeurs1 - valeurs2)/valeurs1) <= precision))
    Cette expression est fausse.

    En C, a || b < c n'a pas le sens attendu. Tu veux : a <c || b < c

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    j'ai un souci maintenant le programme genere une erreur la memoire ne peut être read alors qu'il ne le faisait pas le passage au debugger me laisse penser que lorsue la fonction stcmp arrive à la fin du fichier il plante
    est ce cela qu'on appel effet de bord dans les tutoriaux et comment y remedier

  9. #9
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 43
    Par défaut
    Citation Envoyé par Nalido
    j'ai un souci maintenant le programme genere une erreur la memoire ne peut être read alors qu'il ne le faisait pas le passage au debugger me laisse penser que lorsue la fonction stcmp arrive à la fin du fichier il plante
    est ce cela qu'on appel effet de bord dans les tutoriaux et comment y remedier
    tu accede a une zone ou t'a pas le droit d'ecrire, les erreurs de segmentation par exemple.

Discussions similaires

  1. Nouveau tutoriel de Benoît-M
    Par Smortex dans le forum x86 16-bits
    Réponses: 28
    Dernier message: 28/11/2005, 01h00

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