Bonjour,

dans une fonction que j'ai créée, je cherche à récupérer des données dans un fichier CSV. Vu que je ne connais pas le nombre de données, j'ai décidé de le stocker dans un vector.

La compilation se passe sans problème, mais à chaque fois que j'exécute le programme, il plante en me donnant l'erreur : "Expression: vector subscript out of range".

J'ai essayé de gérer l'allocation de mémoire de façon à m'assurer de ne plus avoir cette erreur, mais il doit y avoir quelque chose qui m'échappe, puisque je n'arrive pas à m'en débarrasser.

La déclaration de mes vectors :

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
#include <vector>
#include <fstream>
 
typedef std::vector<float> lf;
typedef std::vector<std::string> ls;
 
// CGestionFichier
 
class CGestionFichier
{
private:
	char* nomFichier;
	std::fstream fichier;
	std::vector<ls> dataBrute;
	std::vector<std::string> legende;
	std::vector<lf> donnees;
La fonction de récupération dans le fichier :

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
void CGestionFichier::stockageData()
{
	if (ouvertureFichier())
	{
		char *tempLigne, *tempData;
		int i, j;
		int ligne = 0, colonne = 0;									// Position dans le vecteur dataBrute (tableau dynamique)
		int colMax = 0;
 
		tempLigne = new char;
		tempData = new char;
 
		//		Comptage des lignes et allocation de la mémoire pour le tableau
		////////////////////////////////////////////////////////////////////////////////////////////
		while (fichier.getline(tempLigne, 256))
        {
			ligne++;
        }
		dataBrute.resize(ligne);
 
		//		Comptage des colonnes et allocation de la mémoire pour le tableau
		////////////////////////////////////////////////////////////////////////////////////////////
		ligne = 0;
		while (fichier.getline(tempLigne, 256))
        {
			i=0;
			while (tempLigne[i] != '\0')
			{
				if (tempLigne[i] = ';')
				{
					colonne++;
				}
				i++;
			}
			dataBrute[ligne].resize(colonne);
			ligne++;
			colonne=0;
        }
 
		//		Récupération des données
		////////////////////////////////////////////////////////////////////////////////////////////
		ligne = 0;
		while (fichier.getline(tempLigne, 256))						// Tant qu'on arrive à obtenir une ligne et la stocker dans une chaine de 256 caractères
        {
			i=0;													// On initialise les itérateurs
			j=0;
			colonne = 0;											// On revient à la première colonne du tableau
 
			while (tempLigne[i] != '\0')							// Tant qu'on n'a pas le caractère de fin de chaîne
			{
				if (tempLigne[i] = ';')								// Si on arrive à un ';', fin de donnée donc copie
				{
					tempData[j] = '\0';								// On termine la chaîne
					dataBrute[ligne][colonne] = "";					// On initialise
					dataBrute[ligne][colonne] += tempData;			// On copie
					colonne++;										// On passe à la valeur suivante dans la ligne du tableau
					j = 0;											// On revient au premier caractère de la chaîne temporaire
				}
				else												// Si on a autre chose qu'un ';'
				{
					tempData[j] = tempLigne[i];						// On copie le caractère dans la chaîne temporaire
					j++;											// On passe au caractère suivant dans la chaîne temporaire
				}
				i++;												// On passe au caractère suivant dans la ligne
			}
			ligne++;												// On passe à la ligne suivante dans le tableau
        }
		fermetureFichier();
	}
}
Les autres fonctions utilisant les vectors :

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
void CGestionFichier::recupLegende()
{
	legende.resize(dataBrute.size());
	for (unsigned int i = 0; i < dataBrute.size(); i++)
	{
		legende[i] = dataBrute[i][0];
	}
}
 
void CGestionFichier::recupDonnees()
{
	donnees.resize(dataBrute.size());
	for (unsigned int i = 0; i < dataBrute.size(); i++)
	{
		donnees[i].resize(dataBrute[i].size() - 1);
		for (unsigned int j = 0; j < (dataBrute[i].size() - 1) ; j++)
		{
			donnees[i].push_back(atof(dataBrute[i][j + 1].c_str()));
		}
	}
}
 
const char* CGestionFichier::getLegende(int i)
{
	return legende[i].c_str();
}
 
float CGestionFichier::getDonnee(int i, int j)
{
	return donnees[i][j];
}
Merci d'avance pour votre aide !