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 lecture fichier


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut Problème lecture fichier
    Bonjour,

    Je cherche à commencer lire à partir d'un ligne bien déterminé d'un fichier.
    L'intérieur du fichier est quelque chose comme ca.
    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
    NAME: n100mosA.tsp, 100 nodes, semilla 0 
    COMMENT: Problema
    DIMENSION: 101 
    CAPACITY: 218 
    EDGE_WEIGHT_TYPE: EUC_2D 
    NODE_COORD_SECTION 
    1 0.0000 0.0000 
    2 220.0000 -461.0000 
    3 -62.0000 -261.0000 
    4 298.0000 356.0000 
    5 -214.0000 -134.0000 
    6 113.0000 -49.0000 
    7 -399.0000 354.0000 
    . 
    . 
    101 234.000 346.000
    DISPLAY_DATA_SECTION: 
    1 250 250 
    2 360 19 
    3 219 119 
    4 399 428
    5 143 183
    6 306 225
    7 50 427
    8 141 71
    9 461 269
    10 143 473
    11 340 499
    12 446 488
    13 453 328
    14 162 229
    15 120 441
    16 139 363
    17 295 223
    .
    101 223 -234
    DEMAND_SECTION
    1 -214
    2 7
    3 9
    4 -1
    5 9
    6 0
    7 4
    8 1
    9 -5
    10 0
    11 -1
    ...
    101 2
    EOF
    Jecherche à lire les lignes après NODE_COORD_SECTION (le premier colone correpond à l identifiant correspond ville, 2 correspond colone abscisse et 3 ème correspond colone ordonnee)dans le fichier.
    J'ai réalisé ce petit programme. Néomoins, ca se plainte?
    Pourriez-vous m'aider SVP?
    Merci beaucoup.
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
     
     
     
    int main ()
    {
     
    	struct ville								/*definition d'un type structure nommé ville*/
    	{
    		int identifiant;
    		double abscisse;
    		double ordonnee;
    		int demande;							/*demande du ville*/
    		int capacite;									
     
    	};
    	struct    ville Ville[101];				/* variable de type structure ville*/
    	double ** distance_entre_ville;		/*distance euclidiene entre les ville*/
     
    	int i, j;
     
    	/*ouverture du fichier de données pour lecture*/
     
    	FILE * fichier;
     
    	fichier = fopen("D:\\Codes\\TS2004t3\\n100mosA.tsp", "r");
     
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .tsp \n");
    		exit (-1);
    	}
     
     
    /*on commence à lire à la ligne NODE_COORD_SECTION 
    */
     
    	for (i=0; i<6;i++)
    	{
     
    		if (fscanf(fichier, "%d %lf %lf", &(Ville[i].identifiant), &(Ville[i].abscisse), &(Ville[i].ordonnee)) !=0)
    		{
    			printf("Erreur dans le format d'une ligne : ligne %d.\n", i);
                exit(-1);
    		}
    	}
     
    	/*Allocation dynamique du tableau distance*/
    	if(distance_entre_ville = malloc(101 *sizeof(double))== NULL)
    	{
    		printf("erreur lors du malloc sur la taille distance  \n");
    		exit (-1);
    	}
     
    	for (i=0 ; i<101; i++)																													
    		if ((distance_entre_ville[i] = malloc (101 * sizeof(double))) == NULL)
            {
                printf("Erreur lors du malloc sur distance[] ");
                exit (-1);
            }
    	for(i=0;i<101;i++)
    	{
    		for(j=0;j<i;j++)
    		{
    			distance_entre_ville[i][i] = 0.0;
    			distance_entre_ville[i][j]= distance_entre_ville[j][i]=  sqrt(pow((Ville[i].abscisse - Ville[j].abscisse),2.0)+pow((Ville[i].ordonnee - Ville[j].ordonnee),2.0));
    		}
    	}
     
     
    	for (i = 0; i < 101; i++)
     
    		free(distance_entre_ville[i]);
     
    	free(distance_entre_ville);
     
        for(i=0;i<101;i++)
    	{
     
    		for(j=0;j<i;j++)
    		{
    		printf("la distance est %f%f", distance_entre_ville[i][j]);
    		}
    	}
     
    	fclose(fichier);
    	getchar();
     
     
    	return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Quelques remarques après une lecture rapide :

    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		if (fscanf(fichier, "%d %lf %lf", &(Ville[i].identifiant), &(Ville[i].abscisse), &(Ville[i].ordonnee)) !=0)
    fscanf() renvoie le nombre de conversions réussies (ou EOF) donc la comparaison doit être avec 3, pas avec 0

    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if(distance_entre_ville = malloc(101 *sizeof(double))== NULL)
    Ceci est doublement faux
    1- distance_entre_ville est un double ** , le malloc doit allouer 101*sizeof (double*)
    2- l'expression est évaluée comme distance_entre_ville = (malloc(101 *sizeof(double))== NULL) et distance_entre_ville prendra la valeur 1 ou 0 selon la réussite ou l'échec de l'allocation, ce qui n'est pas le but.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((distance_entre_ville = malloc(101 *sizeof(double*)))== NULL)
    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		for(j=0;j<i;j++)
    		{
    		printf("la distance est %f%f", distance_entre_ville[i][j]);
    		}
    Illégal : la mémoire allouée à distance_entre_ville[i] et distance_entre_ville a été précédemment désallouée.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Voilà ce que j ai réalisé. Toutefois, le compilateur me renvoie des erreurs.

    Quelqu'un pourrait-il m'aider à identifier les erreurs.

    Merci.


    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
    115
    116
    117
    118
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
     
     
     
    int main ()
    {
     
    	struct ville								/*definition d'un type structure nommé ville*/
    	{
    		int identifiant;
    		double abscisse;
    		double ordonnee;
     
     
    	};
    	struct    ville Ville[101];				/* variable de type structure ville*/
    	double ** distance_entre_ville;			/*distance euclidiene entre les ville*/
     
    	int i, j;
    	int n = 101;
    	int k = 101;
     
    	/*ouverture du fichier de données pour lecture*/
     
    	FILE * fichier;
     
    	fichier = fopen("D:\\Codes \\TS2004t3\\n100mosA.tsp", "r");
     
    	if(fichier == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .tsp \n");
    		exit (-1);
    	}
     
     
    	/*on commence à lire à la ligne 6: NODE_COORD_SECTION 
    	*/
    	for(i=0;i<6;i++)	
     
    	while(fgetc(fichier)!='\n');
    	for(i=0;i<k;i++)
     
    		if (fscanf(fichier, "%d %lf %lf", &(Ville[i].identifiant), &(Ville[i].abscisse), &(Ville[i].ordonnee)) !=3)
    		{
    			printf("Erreur dans le format d'une ligne : ligne %d.\n", i);
                		exit(-1);
    		}
     
     
    	/*Allocation dynamique du tableau distance*/
    		distance_entre_ville = (double ** ) malloc (k * sizeof (double));
     
    	for (i=0;i<k;i++)
    	{
     
    		distance_entre_ville[i]=(double *)malloc(n * sizeof(double));
    	}
     
     
    	/*calcul distance*/
     	for(i=0;i<k;i++)
    	{
    	for(j=0;j<i+1;j++)
    	{
    		if(i==j)
    		{
    			distance_entre_ville[i][j]= 0.0;
     
    			distance_entre_ville[i][j]= distance_entre_ville[j][i] =  sqrt(pow((Ville[i].abscisse - Ville[j].abscisse),2.0)+pow((Ville[i].ordonnee - Ville[j].ordonnee),2.0));
    		}
    	}
    	/*recopie contenu de la matrice distance entre les villes dans le fichier file*/
     
     
    	FILE * file;
     
    	file = fopen("D:\\Codes\\TS2004t3\\Distance_entre_ville.txt", "w");
     
    	if(file == NULL)
    	{
    		printf("Impossible d'ouvrir fichier .txt \n");
    		exit (-1);
    	}
    	for (i=0; i<k; i++)
    	{ 
    		for (j=0; j<n; j++)
    		{
    			fprintf(file, "%101lf",distance_entre_ville[i][j]);
     
    		} 
    		fprintf (file, "\n" );
     
    	}
     
     
    	/*affichage matrice distance*/
    	for(i=0;i<n;i++)
    	{
    		for(j=0;j<k;j++)
    		{
     
    			printf("Distance[%i][%i]= %lf \n",i, j, distance_entre_ville[i][j]);
    		}
    	}
     
        for(i=0;i<k;i++)
    		free(distance_entre_ville[i]);
        free(distance_entre_ville);
    	/*femeture fichiers*/
    	fclose(fichier);
     
    	getchar();
     
     
    	return 0;
    }
    Erreurs
    1>main.c
    1>d:\codes \alns\alns\main.c(36) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237)*: voir la déclaration de 'fopen'
    1>d:\codes \alns\alns\main.c(52) : warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(256)*: voir la déclaration de 'fscanf'
    1>d:\codes \alns\alns\main.c(85) : error C2275: 'FILE'*: utilisation non conforme de ce type comme expression
    1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(69)*: voir la déclaration de 'FI1>d:\codes thèse\alns\alns\main.c(85) : error C2065: 'file'*: identificateur non déclaré
    1>d:\codes \alns\alns\main.c(87) : error C2065: 'file'*: identificateur non déclaré
    1>d:\codes \alns\alns\main.c(87) : warning C4047: '='*: 'int' diffère de 'FILE *' dans les niveaux d'indirection
    1>d:\codes \alns\alns\main.c(89) : error C2065: 'file'*: identificateur non déclaré
    1>d:\codes \alns\alns\main.c(89) : warning C4047: '=='*: 'int' diffère de 'void *' dans les niveaux d'indirection
    1>d:\codes \alns\alns\main.c(98) : error C2065: 'file'*: identificateur non déclaré
    1>d:\codes \alns\alns\main.c(98) : warning C4047: 'fonction'*: 'FILE *' diffère de 'int' dans les niveaux d'indirection
    1>d:\codes \alns\alns\main.c(98) : warning C4024: 'fprintf'*: types différents pour le paramètre formel et réel 1
    1>d:\codes \alns\alns\main.c(101) : error C2065: 'file'*: identificateur non déclaré
    1>d:\codes \alns\alns\main.c(101) : warning C4047: 'fonction'*: 'FILE *' diffère de 'int' dans les niveaux d'indirection
    1>d:\codes \alns\alns\main.c(101) : warning C4024: 'fprintf'*: types différents pour le paramètre formel et réel 1
    1>Le journal de génération a été enregistré à l'emplacement "file://d:\Codes \ALNS\ALNS\Debug\BuildLog.htm"
    1>ALNS - 6 erreur(s), 8 avertissement(s)
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

Discussions similaires

  1. [VB.NET]Problème lecture fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/05/2006, 17h05
  2. Problème Lecture fichier
    Par Gebudi. dans le forum C++
    Réponses: 1
    Dernier message: 29/05/2006, 09h37
  3. problème lecture fichier
    Par Pleymo dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2005, 10h00
  4. [SAX] Problème lecture fichier xml
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2005, 19h11
  5. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 10h36

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