Bonjour à tous,
Je cherche à lire un fichier qui contient des données que je dois rentrer dans un tableau.
Le problème c'est que les données dans le fichier sont séparées pas des lignes de commentaires.
Je cherche donc à trouver un moyen de sauter ces lignes pour ne pas faire "planter" ma lecture du fichier.
Pour l'instant la méthode que j'ai envisagé est de rentrer les lignes de commentaire dans une string et de continuer ma lecture une fois l'opération faite.
Le problème c'est que ça ne marche pas.
Je ne sais pas si la méthode que j'utilise est la plus adaptée ni même si est est valide mais voici mon code pour l'instant.
Code C++ : 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 #include <iostream> #include <fstream> #include <string> using namespace std; int main() { int i, j; string chaine = ""; fstream file3; double RecadrageX1_SED1[5][5], RecadrageX2_SED1[5][5], RecadrageY1_SED1[5][5], RecadrageY2_SED1[5][5]; file3.open("Recadrage.cal", fstream::in); if (file3.is_open()) { getline(file3, chaine); for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageX1_SED1[i][j]; cout << RecadrageX1_SED1[i][j] << endl; } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageX2_SED1[i][j]; cout << RecadrageX2_SED1[i][j] << endl; } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageY1_SED1[i][j]; cout << RecadrageY1_SED1[i][j] << endl; } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageY2_SED1[i][j]; cout << RecadrageY2_SED1[i][j] << endl; } } file3.close(); } else cout << "file3 not found" <<endl; return 0; }
Le fichier de données source est construit de la manière suivante :
//première ligne : commentaire
//seconde ligne commentaire, début d'une serie de 5 données
5 lignes de données consécutives
//commentaire
5 lignes de données consécutive
.
.
.
etc
Le programme compile et s'execute mais les valeurs affichées par le cout ne sont pas les bonnes : la première serie de 5 nombres lus est cohérente mais la seconde ne l'est plus. (les nombres affichés sont délirants)
J'en déduit donc que le getline que j'ai fait n'est pas effectif ou ne fonctionne pas bien mais je ne comprends pas pourquoi.
Si vous avez une explication ou une autre méthode je suis preneur.
Merci d'avance
Edit :
J'ai résolu le porblème "à la main" : à force de faire des cout des valeurs que je sortais et ce que contient la string j'ai identifié les endroits où ça plantait et j'ai modifié mon code comme suit : (voir les ajouts en bleu)
Code C++ : 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 #include <iostream> #include <fstream> #include <string> using namespace std; int main() { int i, j; string chaine = ""; fstream file3, file4; double RecadrageX1_SED1[5][5], RecadrageX2_SED1[5][5], RecadrageY1_SED1[5][5], RecadrageY2_SED1[5][5]; file3.open("Recadrage_SED1.cal", fstream::in); if (file3.is_open()) { getline(file3, chaine); for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageX1_SED1[i][j]; cout << RecadrageX1_SED1[i][j] << endl; if (j==4) getline(file3, chaine); } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageX2_SED1[i][j]; cout << RecadrageX2_SED1[i][j] << endl; if (j==4) getline(file3, chaine); } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageY1_SED1[i][j]; cout << RecadrageY1_SED1[i][j] << endl; if (j==4) getline(file3, chaine); } } for (i=0;i<5;i++) { getline(file3, chaine); for (j=0;j<5;j++) { file3 >> RecadrageY2_SED1[i][j]; cout << RecadrageY2_SED1[i][j] << endl; if (j==4) getline(file3, chaine); } } file3.close(); } else cout << "file3 not found" <<endl; return 0; }
Tel quel le code compile et s'execute correctement.
Le problème... c'est que je ne comprends pas du tout pourquoi c'est le cas. :ack:
Pour moi il y a des getline "en trop" et donc le code ne devrait pas fonctionner.
De plus sans ces ajouts le programme plantait lors de la seconde boucle de chaque série, or, avec ces modifications, on n'agit que sur la fin de la boucle.
Du coup je suis un peu perdu.
Edit 2 :
J'ai peut-être une hypothèse : je pensais que le "file >>" faisait systématiquement un retour à la ligne, mais si on admet que ce n'est pas le cas cela explique la necessité de faire 2 getline : le premier prend la fin de la ligne et le second saute celle non désirée.
Si j'ai bien compris le problème est le même que celui souligné dans cet article.
Si vous pouviez confirmer/infirmer cette supposition. (et si au passage vous avez une méthode plus propre que celle que j'utilise je vous en serai gré)
P.S. Désolé si mon problème peut sembler simpliste, mais je débute en C++ et mes recherches sur internet / Developpez.com n'ont rien donné de concluant...
Partager