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 :
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
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 :
Ici tout marche bien lors que j’utilise ma fonction void LectureDonnees : Il s'agit de l'affichage sur le TERMINAL :
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
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 :
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.
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
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 ...
Voici mon code source du programme "utils.c" que j'ai compiler simplement avec gcc utils.c -o
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;
}
Pourriez-vous me dire d'abord à première vue, d'où pourrait bien venir le problème.
Merci de votre aide,