[Langage c]: lecture de données
Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

[Langage c]: lecture de données



  1. #1
    invite8b421ec7

    Question [Langage c]: lecture de données


    ------

    Bonjour,

    J'ai le fichier texte ""donnees.text" suivant:

    Code:
    Client abscisse_x   ordonnee_y
    0        40                50
    1       25                 85
    2       22                 75
    3       22                 85
    Il s'agit d'écrire un programme qui permet de lire le fichier et de créer un tableau de clients et d'afficher les informations de tableau de clients.
    Voici mon essai:
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[3];
    int main()
    {
    	FILE* file = NULL;
    
    	int i;	
    	file=fopen("donnees.text","w");
    	if (file != NULL)
                {
    		
    		for(i=0;i<3;i++) // pour chaque client 
                             {
    		    
    	       
    			fscanf(file, " %d  \n",&donnees_clients[i].x);
    			printf("%d", donnees_clients[i].x);
    			
    		}
    
        fclose(file);
       }
    
    getchar ();
        return 0;
    }
    Mais çela ne permet as d'avoir le bon résultat.
    Je ne vois pas où il est le problème.
    Pourriez-vous m'aider?
    Merci par avance.

    -----

  2. #2
    erik

    Re : [Langage c]: lecture de données

    Salut,

    Tu ouvres le fichier en mode écriture : file=fopen("donnees.text","w");
    Essaye file=fopen("donnees.text","r");

  3. #3
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par erik Voir le message
    Salut,

    Tu ouvres le fichier en mode écriture : file=fopen("donnees.text","w");
    Essaye file=fopen("donnees.text","r");
    ah oui
    Mais toujours pas
    il m'affiche que de
    0000
    Il est bloqué au premier caractére.
    Comment résoudre le problème?
    Voici le code avec première rectification
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    	FILE* file = NULL;
    
    	int i;	
    	file=fopen("donnees.text","r");
    	if (file != NULL)
                {
    		
    		for(i=0;i<4;i++) // pour chaque client 
                             {
    		    
    	       
    			fscanf(file, " %d %d \n",&donnees_clients[i].x, donnees_clients[i].y);
    			printf("%d", donnees_clients[i].x);
    			
    		}
    
        fclose(file);
       }
    
    getchar ();
        return 0;
    }
    Merci par avance.
    P.S. désolée pour l'indentation

  4. #4
    doul11

    Re : [Langage c]: lecture de données

    salut,

    il a aussi un problème avec le scanf, il faut tester la réussite de scanf

    il faut tester la réussite de l'ouverture du fichier et indiquer a l'utilisateur si il y a un problème et fermer le flux que si on a réussit a l'ouvrir.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  5. A voir en vidéo sur Futura
  6. #5
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par doul11 Voir le message
    salut,

    il a aussi un problème avec le scanf, il faut tester la réussite de scanf

    il faut tester la réussite de l'ouverture du fichier et indiquer a l'utilisateur si il y a un problème et fermer le flux que si on a réussit a l'ouvrir.
    Voici mon essai

    Code:
    #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE* file = NULL;
    
    	int i;	
    
    	
    	if((file = fopen("donnees.txt", "r")) == NULL)
    		printf("Error: impposble d'ouvrire donnes.txt\n");
    
    	else
    	{
    		{
    			for(i=0;i<4;i++) 
    		    fscanf(file, " %d %d \n",&donnees_clients[i].x, donnees_clients[i].y);
    			printf("%d", donnees_clients[i].x);
    			
    		}
    
        fclose(file);
       }
    
    getchar ();
        return 0;
    }

  7. #6
    doul11

    Re : [Langage c]: lecture de données

    mieux, mais pas encore ça :

    fsanf retourne un int qui donne le nombre de variables lues, tu doit vérifier que ça correspond au nombre de variables que tu veut lire, de plus tu oublie le n° du client, tu demande a fscanf de lire un %d alors que les variables sont des int, il n'y a pas un problème ? quand on fait une lecture dans un fichier il faut aussi penser a tester la fin de fichier.

    il y a un problème avec les accolades dans else


    tu peut écrire un printf un peut plus explicite, si tu en a plusieurs dans un programme tu ne saura pas ce qui est affiché, par exemple :
    Code:
    printf("donnes_client[%i].x = %i\n", i, donnees_clients[i].x);
    n'oublie pas le retour a la ligne '\n'


    Langage C: en autodidacte
    juste une question comme ça : quel livre tu as sur le C ?
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  8. #7
    doul11

    Re : [Langage c]: lecture de données

    autre problème que je viens de voir, dans la lecture du fichier de donnés tu doit ignorer la première ligne.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  9. #8
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Merci pour votre réponse.
    Citation Envoyé par doul11 Voir le message
    quand on fait une lecture dans un fichier il faut aussi penser a tester la fin de fichier.

    il y a un problème avec les accolades dans else


    tu peut écrire un printf un peut plus explicite, si tu en a plusieurs dans un programme tu ne saura pas ce qui est affiché, par exemple :
    Code:
    printf("donnes_client[%i].x = %i\n", i, donnees_clients[i].x);
    n'oublie pas le retour a la ligne '\n'?
    J'ai essayé de faire des modifications suite à ces deux remarques. Toutefois, j'ai éliminé cett ligne suite à votre remarque je n'ai pas comprise
    Citation Envoyé par doul11 Voir le message
    fsanf retourne un int qui donne le nombre de variables lues, tu doit vérifier que ça correspond au nombre de variables que tu veut lire, de plus tu oublie le n° du client, tu demande a fscanf de lire un %d alors que les variables sont des int, il n'y a pas un problème ?
    pour un type entier, le format est %d, non?


    voici le nouveau programme

    Code:
    #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i;	
    	int c;
    	
    	if((file = fopen("donnees.text", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    
    	else
    	{
    		
    		while ((c = fgetc(file)) != EOF)/*affiche le contenu du fichier*/
    		putchar(c);
    		
    		if(feof (file)) /*fin du fichier?*/
    			printf("fin du fichier donnees.text");
    		else /*non*/
    			printf("erreur de lecture\n");
                    
    
    	   fclose(file);
    	}
       
    
    getchar ();
        return 0;
    }
    Citation Envoyé par doul11 Voir le message
    juste une question comme ça : quel livre tu as sur le C ?
    J'ai emprunté dernièrement ce livre de la bibliothèque de l'école
    Langage C programmation windows et lunix (grand livre).

  10. #9
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Rebonjour,

    Je crois que maintenant mon programme marche correctement.
    Des améliorations??
    merci;

    Voici le programme
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i;	
    	
    	
    	if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	else //non
    		
    		for(i=0;i<4;i++)
    		{
    			fscanf(file,"%d \n%d \n%d \n", &i, &donnees_clients[i].x, &donnees_clients[i].y);
    			printf("donnes_client[%i].x = %i \n ", i, donnees_clients[i].x);
    			printf("donnes_client[%i].y = %i  \n", i, donnees_clients[i].y);
    
    		}
    	
          fclose(file);          
    
    	   
    	
       
    
    getchar ();
        return 0;
    }

  11. #10
    invite765732342432
    Invité

    Re : [Langage c]: lecture de données

    Citation Envoyé par celine2 Voir le message
    Des améliorations??
    Actuellement, tu fais ton fclose même si l'ouverture du fichier a échoué... j'ai peur qu'il n'apprécie pas

  12. #11
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par Faith Voir le message
    Actuellement, tu fais ton fclose même si l'ouverture du fichier a échoué... j'ai peur qu'il n'apprécie pas
    Merci de votre réponse.
    Qu'est ce que vous suggérez?

  13. #12
    invite765732342432
    Invité

    Re : [Langage c]: lecture de données

    Citation Envoyé par celine2 Voir le message
    Merci de votre réponse.
    Qu'est ce que vous suggérez?
    Le mettre à l'intérieur du else... mais était-il nécessaire de le préciser ?

    PS: de manière générale, les accolades sont souhaitables dans les if et else quand on écrit plusieurs lignes. Ta notation est parfaitement correcte, mais moins lisible.

  14. #13
    Jack
    Modérateur

    Re : [Langage c]: lecture de données

    actuellement, le programme ne va fonctionner qu'avec un fichier possèdant exactement 4 clients. Il faudrait remplacer la boucle for par une boucle while et tester la fin de fichier pour en sortir.

    tester également le retour de fscanf pour ne pas lire en dehors du fichier.

    A+

  15. #14
    doul11

    Re : [Langage c]: lecture de données

    voila comment j'ai fait :

    Code:
    #include<stdio.h>
    
    typedef struct
    {
    	int x; //abscisse
    	int y; //ordonnée
    
    }Client;
    
    int main()
    {
    int i,j,z;
    Client client[4];
    FILE *file = NULL;
    
    if((file = fopen("data.txt", "r")) == NULL)
    	{
    	perror("impossible d'ouvrir fichier donnees.txt");
    	}
    
    else
    	{
    	while(fgetc(file)!='\n'); //jump first line
    		
    	for(i=0;i<4;i++)
    		{
    		j=fscanf(file,"%i %i %i\n",&z,&client[i].x,&client[i].y);
    		
    		if(j==EOF)
    			{
    			printf("fin de fichier !\n");
    			break;
    			}
    			
    		if(j!=3)
    			{
    			printf("erreur de lecture dans le fichier a la ligne %i\n",i+2);
    			break;
    			}
    		
    		printf("client[%i]\n\tx=%i\n\ty=%i\n", i, client[i].x,client[i].y);
    		}
    
    	fclose(file);
    	printf("\nfin de lecture\n");
    	}
       
    return(0);
    }
    en sortie normale j'ai :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    client[1]
            x=25
            y=85
    client[2]
            x=20
            y=75
    client[3]
            x=22
            y=85
    
    fin de lecture
    [doul@localhost file_read]$
    sortie avec un mauvais non de fichier :
    Code:
    [doul@localhost file_read]$ ./read 
    impossible d'ouvrir fichier data.txt: No such file or directory
    [doul@localhost file_read]$
    sortie si j'essaye de lire plus de clients qu'il n'y en a dans le fichier :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    client[1]
            x=25
            y=85
    client[2]
            x=20
            y=75
    client[3]
            x=22
            y=85
    fin de fichier !
    
    fin de lecture
    [doul@localhost file_read]$
    sortie si j'introduis une erreur dans le fichier de donné, je remplace un nombre par des lettres :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    erreur de lecture dans le fichier a la ligne 3
    
    fin de lecture
    [doul@localhost file_read]$

    ce qui serais bien c'est de faire de l'allocation dynamique pour pouvoir lire un nombre quelconque de client dans le fichier.
    Dernière modification par doul11 ; 25/01/2011 à 17h31.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  16. #15
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par Jack Voir le message
    actuellement, le programme ne va fonctionner qu'avec un fichier possèdant exactement 4 clients. Il faudrait remplacer la boucle for par une boucle while et tester la fin de fichier pour en sortir.

    tester également le retour de fscanf pour ne pas lire en dehors du fichier.

    A+
    Merci pour votre réponse.
    Est ce correcte?
    Code:
     #include<stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, 
    	
    	
    	if((file = fopen("D:\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	else //non
    	{
    		for(i=0;i<4;i++)
    		{
    
    			fscanf(file,"%d \n%d \n%d \n", &i, &donnees_clients[i].x, &donnees_clients[i].y) ;
    			printf("donnes_client[%i].x = %i donnes_client[%].y = %i \n", i, donnees_clients[i].x, donnees_clients[i].y);
    		}
    		
    		if (feof(file))//fin du fichier ?
    			printf("fin du fichier");
    		else //non
    
    		{
    			printf("erreur de lecture");
    		}
    		
    
    		
    		fclose(file);
    	}
    	
         
    	   
    	
       
    
    getchar ();
        return 0;
    }

  17. #16
    Jack
    Modérateur

    Re : [Langage c]: lecture de données

    ce qui serais bien c'est de faire de l'allocation dynamique pour pouvoir lire un nombre quelconque de client dans le fichier.
    Une solution intermédiaire est de définir un tableau de taille suffisante pour recueillir les données du fichier, si on admet que le ficier ne pourra pas posséder plus d'un certain nombre de clients.

    Est ce correcte?
    En revanche, je remplacerais le for par un do while comme je l'ai indiqué pércedemment

    Quelque chose comme ça:
    Code:
    char foo[20];
    //...
     if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL){/*ouverture du fichier en lecture*/
      printf("Error: impossible d'ouvrir fichier donnees.txt\n");
      exit(-1);
    }
       fscanf(file,"%s %s %s", foo, foo, foo); // pour faire sauter la ligne d'entête
      
      i=0;
      do  {
         if (fscanf(file,"%d %d %d", &i, &donnees_clients[i].x, &donnees_clients[i].y) == 3){ // 3 éléments lus correctement
            printf("donnes_client[%i].x = %i \n ", i, donnees_clients[i].x);
            printf("donnes_client[%i].y = %i  \n", i, donnees_clients[i].y);
            i++;
         }
      } while (!eof(file);
     
      fclose(file);
    non testé

    A+
    Dernière modification par Jack ; 25/01/2011 à 18h30. Motif: petite correction

  18. #17
    Jack
    Modérateur

    Re : [Langage c]: lecture de données

    on aurait également pu utiliser un fgets() pour faire sauter la ligne d'entête.

    A+

  19. #18
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par Jack Voir le message
    Une solution intermédiaire est de définir un tableau de taille suffisante pour recueillir les données du fichier, si on admet que le ficier ne pourra pas posséder plus d'un certain nombre de clients.

    En revanche, je remplacerais le for par un do while comme je l'ai indiqué pércedemment

    Quelque chose comme ça:
    Code:
    char foo[20];
    //...
     if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL){/*ouverture du fichier en lecture*/
      printf("Error: impossible d'ouvrir fichier donnees.txt\n");
      exit(-1);
    }
       fscanf(file,"%s %s %s", foo, foo, foo); // pour faire sauter la ligne d'entête
      
      i=0;
      do  {
         if (fscanf(file,"%d %d %d", &i, &donnees_clients[i].x, &donnees_clients[i].y) == 3){ // 3 éléments lus correctement
            printf("donnes_client[%i].x = %i \n ", i, donnees_clients[i].x);
            printf("donnes_client[%i].y = %i  \n", i, donnees_clients[i].y);
            i++;
         }
      } while (!eof(file);
     
      fclose(file);
    non testé

    A+
    merci beaucoup pour ces corrections

  20. #19
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par doul11 Voir le message
    voila comment j'ai fait :

    Code:
    #include<stdio.h>
    
    typedef struct
    {
    	int x; //abscisse
    	int y; //ordonnée
    
    }Client;
    
    int main()
    {
    int i,j,z;
    Client client[4];
    FILE *file = NULL;
    
    if((file = fopen("data.txt", "r")) == NULL)
    	{
    	perror("impossible d'ouvrir fichier donnees.txt");
    	}
    
    else
    	{
    	while(fgetc(file)!='\n'); //jump first line
    		
    	for(i=0;i<4;i++)
    		{
    		j=fscanf(file,"%i %i %i\n",&z,&client[i].x,&client[i].y);
    		
    		if(j==EOF)
    			{
    			printf("fin de fichier !\n");
    			break;
    			}
    			
    		if(j!=3)
    			{
    			printf("erreur de lecture dans le fichier a la ligne %i\n",i+2);
    			break;
    			}
    		
    		printf("client[%i]\n\tx=%i\n\ty=%i\n", i, client[i].x,client[i].y);
    		}
    
    	fclose(file);
    	printf("\nfin de lecture\n");
    	}
       
    return(0);
    }
    en sortie normale j'ai :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    client[1]
            x=25
            y=85
    client[2]
            x=20
            y=75
    client[3]
            x=22
            y=85
    
    fin de lecture
    [doul@localhost file_read]$
    sortie avec un mauvais non de fichier :
    Code:
    [doul@localhost file_read]$ ./read 
    impossible d'ouvrir fichier data.txt: No such file or directory
    [doul@localhost file_read]$
    sortie si j'essaye de lire plus de clients qu'il n'y en a dans le fichier :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    client[1]
            x=25
            y=85
    client[2]
            x=20
            y=75
    client[3]
            x=22
            y=85
    fin de fichier !
    
    fin de lecture
    [doul@localhost file_read]$
    sortie si j'introduis une erreur dans le fichier de donné, je remplace un nombre par des lettres :
    Code:
    [doul@localhost file_read]$ ./read 
    client[0]
            x=40
            y=50
    erreur de lecture dans le fichier a la ligne 3
    
    fin de lecture
    [doul@localhost file_read]$
    Merci beaucoup doul pour votre aide précieuse.
    Citation Envoyé par doul11 Voir le message
    ce qui serais bien c'est de faire de l'allocation dynamique pour pouvoir lire un nombre quelconque de client dans le fichier
    SVP ne tapez pas fort, je suis encore débutante.
    Mercin c'est une bonne idée.
    Par contre, je prèfere choisir un truc plus simple à ce niveau .

    Là, je voulais calculer la distance euclidienne entre deux clients quelconque de coordonnées x et y.
    Par définition,
    la distance euclidienne = la racine carrée de ((x1- y1)²+x2- y2)² ).]
    Pour celà,
    j'ai procédé comme suit:J'ai calculé le carré de différence entre x et y pour chaque client, j'ai mis le résultat dans un tableau de taille égale au nombre de client (tableau). Ex (x1-y1)*(x1-y1), etcJ'ai calculé la somme de résultat de l'étape 1, j'ai mis le résultat dans un autre tableau "s-tableau" de taille égale au nombre de client, Ex: somme de (x1-y1)*(x1-y1) + (x2-y2)*(x2-y2)enfin j'ai utilisé la fonction sqrt pour faire la racine carré du résultat du tableau "s_tableau" et j'ai mis le résultat dans un tableau de deux dimensions.
    Est ce logique?
    Merci pour vos corrections.

    voici mon code
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, j; 
    	int tableau[4] = {0};//initialisation tableau, pour tout i, produit de x - y
    	int s_tableau[4] = {0}; // initialisation du s-tableau, il  comprend somme produit x - y
    	float distance[4][4] = {0};// initialisation tableau distance
    	
    	if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	
    	else//non
    	{
    	
    		while(fgetc(file)!='\n'); //jump first line
    		for(i=0;i<4;i++)
    		{
    			
    			j=fscanf(file,"%i %i %i\n",&i,&donnees_clients[i].x,&donnees_clients[i].y);
    			if(j==EOF)
    			{
    				printf("fin de fichier !\n");
    				break;
    			}
    			
    		if(j!=3)
    			{
    			printf("erreur de lecture dans le fichier a la ligne %i\n",i+2);
    			break;
    			}
    		
    		printf("donnees_clients[%i]\n tx=%i\n ty=%i\n", i, donnees_clients[i].x,donnees_clients[i].y);
    		}
    		for(i=0;i<4;i++)
    		{
    			//on va calculer la distance euclidienne
    			tableau[i]= (donnees_clients[i].x - donnees_clients[i].y)*(donnees_clients[i].x - donnees_clients[i].y);
    			printf("%d\n",tableau[i]);
    		}
    		for(i=0;i<4;i++)
    		{
    			for(j=0;j<4;j++)
    			{
    				s_tableau[i][j] = tableau[i]+ tableau[j];
    			}
    		}
    		for(i=0;i<4;i++)
    		{
    			for(j=0;j<4;j++)
    			{
    				distance [i][j]= sqrt (s_tableau[i][j]);
    				printf("%f", distance[i][j]);
    			}
    
    		}
    
    
    	fclose(file);
    	printf("\fin de lecture\n");
    	}
      getchar(); 
    return(0);
    }

  21. #20
    doul11

    Re : [Langage c]: lecture de données

    t'est sur de ton coup avec la distance euclidienne ? j'aurais plutôt utilisé la longueur :

    pour stocker le résultat un tableau de dimension 2 suffit
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  22. #21
    invite8b421ec7

    Re : [Langage c]: lecture de données

    Citation Envoyé par doul11 Voir le message
    t'est sur de ton coup avec la distance euclidienne ? j'aurais plutôt utilisé la longueur :

    pour stocker le résultat un tableau de dimension 2 suffit
    oui oui j'en ai sure.
    C'est plutot
    [/QUOTE]
    Pourriez-vous me dire si c'est correcte ce que j'ai fait
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, j; 
    	int tableau[4] = {0};//initialisation tableau, pour tout i, produit de x - y
    	int s_tableau[4] = {0}; // initialisation du s-tableau, il  comprend somme produit x - y
    	float distance[4][4] = {0};// initialisation tableau distance
    	
    	if((file = fopen("D:\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	
    	else//non
    	{
    	
    		while(fgetc(file)!='\n'); //jump first line
    		for(i=0;i<4;i++)
    		{
    			
    			j=fscanf(file,"%i %i %i\n",&i,&donnees_clients[i].x,&donnees_clients[i].y);
    			if(j==EOF)
    			{
    				printf("fin de fichier !\n");
    				break;
    			}
    			
    		if(j!=3)
    			{
    			printf("erreur de lecture dans le fichier a la ligne %i\n",i+2);
    			break;
    			}
    		
    		printf("donnees_clients[%i]\n\tx=%i\n\ty=%i\n", i, donnees_clients[i].x,donnees_clients[i].y);
    		}
    		//on va calculer la distance euclidienne
    		for(i=0;i<4;i++)
    		{
    			
    			tableau[i]= (donnees_clients[i].x - donnees_clients[i].y)*(donnees_clients[i].x - donnees_clients[i].y);
    			
    			printf("\n tableau[%i] =%i", i, tableau[i]);
    		}
    		for(i=0;i<4;i++)
    		{
    			
    			for(j=0;j<4;j++)
    			{
    				s_tableau[i][j] = tableau[i]+ tableau[j];
    				printf("\n tableau =%d \n", tableau[i][j]);
    			}
    
    		}
    		
    
    
    	fclose(file);
    	printf("\n fin de lecture\n");
    	}
      getchar(); 
    return(0);
    }
    Merci!

  23. #22
    invite025015c2

    Re : [Langage c]: lecture de données

    Pour de l'allocation dynamique, regarde du côté des liste chainées (une simple devrait suffire dans ton cas).

    Mais si t'as pas encore vu les pointeur, un tableau en dur c'est bon aussi, un peu moins propre.

  24. #23
    invite8b421ec7

    Question Re : [Langage c]: lecture de données

    Bonjour,

    Je suis arrivée au code suivant.
    Toutefois, celà ne fonctionne pas correctement.

    Des corrections?
    Merci par avance.

    Code:
    #include<stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, j; 
    	int tableau[4] = {0};//initialisation tableau, pour tout i, produit de x - y
    	int *s_tableau ;// allaocation dynamique d'un tableau
    	double *distance;
    	s_tableau = malloc(400);
    	distance = malloc(400);
    	
    	
    	if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	
    	else//non
    	{
    	
    		while(fgetc(file)!='\n'); //jump first line
    		for(i=0;i<4;i++)
    		{
    			
    			j=fscanf(file,"%i %i %i\n",&i,&donnees_clients[i].x,&donnees_clients[i].y);
    			if(j==EOF)
    			{
    				printf("fin de fichier !\n");
    				break;
    			}
    			
    		if(j!=3)
    			{
    			printf("erreur de lecture dans le fichier a la ligne %i\n",i+2);
    			break;
    			}
    		
    		printf("donnees_clients[%i]\n\tx=%i\n\ty=%i\n", i, donnees_clients[i].x,donnees_clients[i].y);
    		}
    		//on va calculer le carré des écarts 
    		for(i=0;i<4;i++)
    		{
    			
    			tableau[i]= (donnees_clients[i].x - donnees_clients[i].y)*(donnees_clients[i].x - donnees_clients[i].y);
    			
    			printf("\n tableau[%i] =%i", i,tableau[i]);
    		}
    		
    		if (s_tableau == NULL)
    		printf("allocation demandée impossible!\n");
    		else
    			for(i=0;i<4;i++)
    				{			
    					for(j=0;j<4;j++)
    					{
    						s_tableau[i]= tableau[i]+ tableau[j];
    						
    						printf("\n s_tableau [%i]= %i ",i, *(s_tableau+i));
    					}
    			    }
    			if (distance == NULL)
    		printf("allocation demandée impossible!\n");
    		else
    			for(i=0;i<4;i++)
    				{			
    										
    						distance[i]= sqrt(s_tableau[i]);
    						
    						printf("\n distance [%i]= %i ",i,  *(distance+i));
    				}
    			    
    			
    		
             //on va la somme des carrées des écarts
    
    	fclose(file);
    	printf("\n fin de lecture\n");
    	}
      getchar(); 
    return(0);
    }

  25. #24
    Jack
    Modérateur

    Re : [Langage c]: lecture de données

    Je suis arrivée au code suivant.
    Toutefois, celà ne fonctionne pas correctement.

    Des corrections?
    Je ne comprends pas pourquoi tu ne dis pas simplement ce qui ne marche pas. Je ne sais pas si tu te rends compte, mais ça prend du temps d'analyser tout ce code à la recherche d'un problème inconnu.

    A+

  26. #25
    bzh_nicolas

    Re : [Langage c]: lecture de données

    Moi je ne comprends pas pourquoi tu te compliques la vie avec des tableaux intermédiaires pour calculer les distances. Pourquoi ne pas faire le calcul directement. En plus tu alloues la même taille à ton tableau de résultat qu'à ton tableau intermédiaire. J'ai un peu la flemme de dérouler l'algo pour vérifier mais j'ai un doute quand à la pertinence de la méthode. Tu risques d'avoir des surprises quand tu va approcher les limites de taille de ton tableau.

    Idem pour ton tableau donnees_client, tu initialises tout à 4 mais si tu mets un cinquième enregistrement, tu reprends tout le code à la main pour remplacer le 4 par un 5 (ce n'est pas très productif) ?
    Ou alors tu ne prévois pas de dépasser 4 clients et là on en vient au point suivant (qui est d'ailleurs valable sans cette condition) :

    En plus tu fais un malloc(400) : si tu donnes la même taille à chaque fois l'allocation dynamique ne sert à rien. L'intérêt de l'allocation dynamique c'est de pouvoir changer la taille suivant les cas d'exécution.

    Récupères toutes tes données clients et calcule directement la distance entre chaque. Et si tu tiens à utiliser l'allocation dynamique, tu dois pouvoir trouver une formule qui te donnera la taille du tableau de distances à allouer suivant le nombre de clients.

  27. #26
    bzh_nicolas

    Re : [Langage c]: lecture de données

    trop tard pour éditer :
    Ton malloc est dangereux aussi : tu alloues 400 octets, t'es-tu demandé combien de int ça représente, pour savoir combien tu peux y mettre ?
    Pour ton tableau distance : 400 octets aussi. Même remarque que précédemment.
    De plus les int et les double n'occupent pas la même taille en mémoire : 4 octets pour un int (soit 100 éléments dans ton tableau) 8 octets pour un double (soit 50 éléments dans ton tableau).

  28. #27
    invite8b421ec7

    Question Re : [Langage c]: lecture de données

    Citation Envoyé par bzh_nicolas Voir le message
    Moi je ne comprends pas pourquoi tu te compliques la vie avec des tableaux intermédiaires pour calculer les distances. Pourquoi ne pas faire le calcul directement. En plus tu alloues la même taille à ton tableau de résultat qu'à ton tableau intermédiaire. J'ai un peu la flemme de dérouler l'algo pour vérifier mais j'ai un doute quand à la pertinence de la méthode. Tu risques d'avoir des surprises quand tu va approcher les limites de taille de ton tableau.

    Idem pour ton tableau donnees_client, tu initialises tout à 4 mais si tu mets un cinquième enregistrement, tu reprends tout le code à la main pour remplacer le 4 par un 5 (ce n'est pas très productif) ?
    Ou alors tu ne prévois pas de dépasser 4 clients et là on en vient au point suivant (qui est d'ailleurs valable sans cette condition) :

    En plus tu fais un malloc(400) : si tu donnes la même taille à chaque fois l'allocation dynamique ne sert à rien. L'intérêt de l'allocation dynamique c'est de pouvoir changer la taille suivant les cas d'exécution.

    Récupères toutes tes données clients et calcule directement la distance entre chaque. Et si tu tiens à utiliser l'allocation dynamique, tu dois pouvoir trouver une formule qui te donnera la taille du tableau de distances à allouer suivant le nombre de clients.
    J'ai ré-écris mon programme. Je l'ai testé mais il m'affiche pas le résultat.
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, j; 
    	
    	double distance[4][4]={0};
    	
    	
    	
    	
    	if((file = fopen("D:\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	
    	else//non
    	{
    	
    		while(fgetc(file)!='\n'); //jump first line
    		for(i=0;i<4;i++)
    		{
    			
    			j=fscanf(file,"%i %i %i\n",&i,&donnees_clients[i].x,&donnees_clients[i].y);
    			if(j==EOF)
    			{
    				printf("fin de fichier !\n");
    				break;
    			}
    		}
    			
    		
    		
    		printf("donnees_clients[%i]\n\tx=%i\n\ty=%i\n", i, donnees_clients[i].x,donnees_clients[i].y);
    		
    		
    		
    		
    			for(i=0; i<4; i++)
    			{
    				for(j=0;j<i+1;j++)
    				{
    					distance[i][j]= sqrt((donnees_clients[i].x - donnees_clients[i].y)*(donnees_clients[i].x - donnees_clients[i].y)+(donnees_clients[i].x - donnees_clients[i].y)*(donnees_clients[j].x - donnees_clients[j].y));
    				
    					
    					if(i=j)distance [i][j]= 0;
    					else
    					{
    									
    						distance [i][j] = distance [j][i];
    						printf("distance\n %lf", distance[i][j]);
    					}
    			    }
    			}
    	
    	fclose(file);
    	printf("\n fin de lecture\n");
    	}
    	
      getchar(); 
    return(0);
    }
    Pourriez-vous m'aider.
    Merci.

  29. #28
    bzh_nicolas

    Re : [Langage c]: lecture de données

    Citation Envoyé par celine2 Voir le message
    Code:
    if(i=j)distance [i][j]= 0;
    Ta comparaison est toujours vrai car tu n'utilises pas l'opérateur de comparaison, tu fais une affectation, donc tu écrases toutes les valeurs calculées par 0.
    Il faut remplacer par :
    Code:
    if (i==j) distance [i][j]= 0;

  30. #29
    invite8b421ec7

    Question Re : [Langage c]: lecture de données

    Voici ma nouvelle version du code

    Il se complie bien mais les il y a des résultats de calculs faux.
    Pourriez-vous m'aider?
    Merci.
    Code:
    #include<stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    typedef struct
    {
    	int x;	//abscisse
    	int y; //ordonnée
    
    }Client;
    
    
    Client donnees_clients[4];
    int main()
    {
    
    	FILE *file = NULL;
    	int i, j; 
    	
    	int distance[4][4];
    	
    	
    	
    	
    	if((file = fopen("D:\\Codes_Thèse\\calcul_distance_euclidienne\\calcul_distance_euclidienne\\donnees.txt", "r")) == NULL)/*ouverture du fichier en lecture*/
    		printf("Error: impossible d'ouvrir fichier donnees.txt\n");
    	
    	else//non
    	{
    	
    		while(fgetc(file)!='\n'); 
    		for(i=0;i<4;i++)
    		{
    			
    
    			j=fscanf(file,"%i %i %i\n",&i,&donnees_clients[i].x,&donnees_clients[i].y);
    			if(j==EOF)
    			{
    			printf("fin de fichier !\n");
    			break;
    			}
    
    		
    			printf("donnees_clients[%i]\n\tx=%i\n\ty=%i\n", i, donnees_clients[i].x,donnees_clients[i].y);
    		}
    		
    		
    		
    		
    			for(i=0; i<4; i++)
    			{
    				for(j=0;j<i+1;j++)
    				{
    					if(i==j)
    					{
    						distance [i][j]= 0;
    						
    					}
    												
    					else
    					{
    						for(i=0; i<4; i++)
    						{
    							for(j=0;j<i+1;j++)
    							{			
    								distance [i][j] = distance [j][i];
    								distance[i][j]= sqrt((donnees_clients[i].x - donnees_clients[j].x)*(donnees_clients[i].x - donnees_clients[j].x)+(donnees_clients[i].y - donnees_clients[j].y)*(donnees_clients[i].y - donnees_clients[j].y));
    							}
    						}
    							
    					}
    				}
    			  }
    			for(i=0; i<4; i++)
    			{
    				for(j=0;j<4;j++)
    				{
    					printf("distance[%i][%i] = %i\n\n ",i, j, distance[i][j]);
    				}
    			}
    			
    			
    	
    	fclose(file);
    	printf("\n fin de lecture\n");
    	}
    	
      getchar(); 
    return(0);
    }
    Fichier de données

    1
    2
    3
    4
    5
    6 Client abscisse_x ordonnée_y

    0 40 50
    1 25 85
    2 22 75
    3 22 85

  31. #30
    whoami

    Re : [Langage c]: lecture de données

    Bonjour,

    Au lieu d'attendre qu'on dépouille ton code, prends-toi en mains, et suis son fonctionnement pas à pas, et tu trouveras ce qui se passe, avec un bonus : tu apprendras à trouver un problème.

Discussions similaires

  1. Langage C: génération de données
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 52
    Dernier message: 19/01/2011, 22h36
  2. Lecture de données MJPEG
    Par bidouille69 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 18/08/2010, 10h02
  3. [langage C] lecture de fichiers
    Par invite18bdb004 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 14/11/2009, 19h55
  4. le langage la lecture et l'écriture
    Par invite86fe4f5c dans le forum Psychologies (archives)
    Réponses: 7
    Dernier message: 30/06/2009, 10h09
  5. Lecture dans un fichier texte en Langage C
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 16/04/2007, 12h04