Bonjour à tous ! Je ne suis pas un spécialiste du C, si mon erreur est stupide, c'est que je suis stupide x)
Voici mon problème, je souhaite récupérer des données triées dans un fichier .txt et les stocker dans des variables, tableaux, variables de structures etc. Ce sont des données représentatives de lignes ferroviaires pour Trains. Voici comment sont organisées mes données:
Ceci est mon fichier "Informations.txt" , l'original est sans les commentaires style C, je les ai rajouté pour que vous compreniez :
Mon gros problème c'est que j'arrive à afficher correctement mes données au fil de l'opéation directement après stockage, mais quand je veux réaccéder à mes valeurs plus tard, les données sont perdus partiellement. Voici une illustration de mon problème :10 //nombre de villes
383 886 777 915 793 335 386 492 649 763 926 540 426 172 736 874 125 698 187 265 //coordonnées des villes
2 //nombre de lignes sur tout le réseau
3 //nombre de villes dans la première ligne
1 0 9 //villes de la première ligne
2 //nombre de passages journalier
14h44 18h41 21h16 //horaires du 1er passage
03h30 07h27 10h02 //horaires du 2è passage
3
3 8 6
3
20h33 22h13 02h10
05h02 06h42 10h39
12h50 14h30 18h27
Ici tout marche bien lors que j’utilise ma fonction void LectureDonnees : Il s'agit de l'affichage sur le TERMINAL :
Mais une fois que je tente de réaccéder à ces données avec la fonction main, les données sont en partie erronée, pas toutes :Il y'a 10 villes
Les coordonnées de la ville sont 383 886
Les coordonnées de la ville sont 777 915
Les coordonnées de la ville sont 793 335
Les coordonnées de la ville sont 386 492
Les coordonnées de la ville sont 649 763
Les coordonnées de la ville sont 926 540
Les coordonnées de la ville sont 426 172
Les coordonnées de la ville sont 736 874
Les coordonnées de la ville sont 125 698
Les coordonnées de la ville sont 187 265
Il y'a 2 lignes
Il y'a 3 villes sur la ligne 0
Il y'a la ville n° 1
Il y'a la ville n° 0
Il y'a la ville n° 9
Il y'a 2 passages journaliers sur cette ligne
Voici le passage n° 0
14 heures et 44 minutes
18 heures et 41 minutes
21 heures et 16 minutes
Voici le passage n° 1
3 heures et 30 minutes
7 heures et 27 minutes
10 heures et 2 minutes
Il y'a 3 villes sur la ligne 1
Il y'a la ville n° 3
Il y'a la ville n° 8
Il y'a la ville n° 6
Il y'a 3 passages journaliers sur cette ligne
Voici le passage n° 0
20 heures et 33 minutes
22 heures et 13 minutes
2 heures et 10 minutes
Voici le passage n° 1
5 heures et 2 minutes
6 heures et 42 minutes
10 heures et 39 minutes
Voici le passage n° 2
12 heures et 50 minutes
14 heures et 30 minutes
18 heures et 27 minutes
Le diagnostic est que le programme semble se tromper en récupérant le numéro des villes à un moment donnée et réussit correctement après , et il semble écraser les horaires précédentes des lignes.
J'ai cherché à trouver ma boulette, sans succès, quelque chose ne devrait pas aller avec mes malloc, fscanf, ou alors je me suis gourer dans les indices d'une boucle for, à vrai dire je ne sais vraiment pas ...Les coordonnées de la ville sont 383 886
Les coordonnées de la ville sont 777 915
Les coordonnées de la ville sont 793 335
Les coordonnées de la ville sont 386 492
Les coordonnées de la ville sont 649 763
Les coordonnées de la ville sont 926 540
Les coordonnées de la ville sont 426 172
Les coordonnées de la ville sont 736 874
Les coordonnées de la ville sont 125 698
Les coordonnées de la ville sont 187 265
Il y'a 3 villes sur la ligne 0
Il y'a la ville n° 1
Il y'a la ville n° 3 -----------------------------------> se trompe en prenant les villes à partir d'ici
Il y'a la ville n° 37715008
Il y'a 2 passages journaliers sur cette ligne
Voici le passage n° 0
37714496 heures et 0 minutes
37714624 heures et 0 minutes -------> Horaires erronées
37714752 heures et 0 minutes
Voici le passage n° 1
3 heures et 30 minutes
7 heures et 27 minutes -------------> Horaires correctes
10 heures et 2 minutes
Il y'a 3 villes sur la ligne 1
Il y'a la ville n° 3
Il y'a la ville n° 8 -----------------> Réussit à récupérer les villes
Il y'a la ville n° 6
Il y'a 3 passages journaliers sur cette ligne
Voici le passage n° 0
37716544 heures et 0 minutes
37716672 heures et 0 minutes ---------------> ERREUR horraire
37716800 heures et 0 minutes
Voici le passage n° 1
37716576 heures et 0 minutes
37716704 heures et 0 minutes ----------------> ERREUR horaire
37716832 heures et 0 minutes
Voici le passage n° 2
12 heures et 50 minutes
14 heures et 30 minutes -------------------> horaire correcte
18 heures et 27 minutes
Voici mon code source du programme "utils.c" que j'ai compiler simplement avec gcc utils.c -o
Pourriez-vous me dire d'abord à première vue, d'où pourrait bien venir le problème.
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 /* * utils.c * * Created on: 21 janv. 2017 * Author: totor */ #include <stdio.h> #include <stdlib.h> int nb_villes; //nombres de villes int nb_lignes; //nombre lignes de trains typedef struct Horaire Horaire; struct Horaire { // structure d'une Horaire int heures; int minutes; }; typedef struct Coordonnees Coordonnes; struct Coordonnees { // structure de coordonnées int abscisse; int ordonnee; }; typedef struct Villa Villa; struct Villa { // structure d'une ville Coordonnes position; }; Villa *ListeVille; typedef struct Ligne Ligne; struct Ligne { // structure d'une ligne int identifiant; int nb_villes_ligne; int* TableauVilleSurLigne; int nb_passage_sur_ligne; Horaire** ListeHoraire; //Liste Horaire[num passage][Liste Horaire] ?? }; Ligne *ListeLigne; void affiche_coordonnees_ville(int NumeroVille, Villa ville[]) { printf("Les coordonnées de la ville %d sont %d %d \n", NumeroVille, ville[NumeroVille].position.abscisse, ville[NumeroVille].position.ordonnee); } void LectureDonnees() { FILE *infos; //pointeur vers fichiers infos = fopen("Informations.txt", "r"); //mettre chemin relatifs si nécessaire if (infos == NULL) { printf( "Erreur d'ouverture du fichier ou 'Informations.txt' manquant \n"); exit(1); } else { fscanf(infos, "%d", &nb_villes); // récupère le nombre de villes sur tout le réseau ferroviaire printf("Il y'a %d villes \n", nb_villes); ListeVille = (Villa*) malloc(nb_villes * 2 * sizeof(int)); // x2 car Coordonnées double --- x et y ???? for (int i = 0; i < nb_villes; i++) { fscanf(infos, "%d %d", &ListeVille[i].position.abscisse, &ListeVille[i].position.ordonnee); //récupère coordonnées des villes printf("Les coordonnées de la ville sont %d %d \n", ListeVille[i].position.abscisse, ListeVille[i].position.ordonnee); } fscanf(infos, "%d", &nb_lignes); // affiche le nombre de lignes de train printf("Il y'a %d lignes \n", nb_lignes); ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(int)); for (int i = 0; i < nb_lignes; i++) { fscanf(infos, "%d", &ListeLigne[i].nb_villes_ligne); //récupère nombres de villes sur la ligne printf("Il y'a %d villes sur la ligne %d\n", ListeLigne[i].nb_villes_ligne, i); ListeLigne[i].TableauVilleSurLigne = (int*) malloc( (ListeLigne[i].nb_villes_ligne) * sizeof(int)); // On alloue le nécessaire for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) { fscanf(infos, "%d", &ListeLigne[i].TableauVilleSurLigne[k]); //récupère identifiants des villes sur la ligne printf("Il y'a la ville n° %d\n", ListeLigne[i].TableauVilleSurLigne[k]); } fscanf(infos, "%d", &ListeLigne[i].nb_passage_sur_ligne); //récupère le nombre de passage sur cette ligne printf("Il y'a %d passages journaliers sur cette ligne\n", ListeLigne[i].nb_passage_sur_ligne); for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) { printf("Voici le passage n° %d \n", l); ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(&ListeLigne[i].ListeHoraire) * ListeLigne[i].nb_passage_sur_ligne); //allocation tableau double dimension for (int compt = 0; compt < 20; compt++) ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc( sizeof(**ListeLigne[i].ListeHoraire) * ListeLigne[i].nb_villes_ligne); for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) { fscanf(infos, "%dh%d", &ListeLigne[i].ListeHoraire[j][l].heures, &ListeLigne[i].ListeHoraire[j][l].minutes); //récupère les horaires journalières printf("%d heures et %d minutes\n", ListeLigne[i].ListeHoraire[j][l].heures, ListeLigne[i].ListeHoraire[j][l].minutes); } } } } } int main() { LectureDonnees(); printf( "--------------------------------------------------------------------------\n ---------------------- \n ------------------------\n"); for (int i = 0; i < nb_villes; i++) { printf("Les coordonnées de la ville sont %d %d \n", ListeVille[i].position.abscisse, ListeVille[i].position.ordonnee); } for (int i = 0; i < nb_lignes; i++) { printf("Il y'a %d villes sur la ligne %d\n", ListeLigne[i].nb_villes_ligne, i); for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) { printf("Il y'a la ville n° %d\n", ListeLigne[i].TableauVilleSurLigne[k]); } printf("Il y'a %d passages journaliers sur cette ligne\n", ListeLigne[i].nb_passage_sur_ligne); for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) { printf("Voici le passage n° %d \n", l); for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) { printf("%d heures et %d minutes\n", ListeLigne[i].ListeHoraire[j][l].heures, ListeLigne[i].ListeHoraire[j][l].minutes); } } } return 0; }
Merci de votre aide,
Partager