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 :

création d'une fonction qui lit un fichier csv


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2020
    Messages : 12
    Par défaut création d'une fonction qui lit un fichier csv
    Bonjour;
    j'ai créer une fonction "array_read" qui permet de lire un fichier csv contenant 4 lignes et 5 colonnes de type double chaque case contient 1 ou 0, ensuite faire un appel de la fonction pour effectuer des calcules sur le fichier csv,
    le résultat affiché n'est pas correcte
    voilà le code que j'ai réalisé, mais je vois pas il est où 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
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    using namespace std;
    vector<vector<double> > array_read(istream &filename)
    {
        //vector< vector<double> >array(cols, std::vector<double>(lines));
        vector< std::vector<double> > array;
        std::vector<double> array_line;
     
        std::string csv_line, word;
        double value;
     
        while ( getline(filename, csv_line) ) {
            array_line.clear();
            std::stringstream ss(csv_line);
     
            std::cout << "line: " << csv_line << std::endl;
     
            while ( getline(ss, word, ';') ) {
                value = strtod(word.c_str(), NULL);
                std::cout << "*) value: " << value << std::endl;
     
                array_line.push_back(value);
            }
     
            array.push_back(array_line);
        }
        return array;
    }
    int main(int argc, char *argv[])
    {
     
        ifstream filename("C:/Users/click/Desktop/exemple.csv");
        if (!filename) {
            std::cerr << "main - error: can't open file " << filename << std::endl;
     
            return EXIT_FAILURE;
        }
     
        int value = 0;
     int val=0;
     int sim[4][5]={0};
     //int lines=4;
     //int cols=5;
     int array[30][30];
     
     
     for(int i=0;i<4;++i)
     for(int j=0;j<4;++j)
     for(int k=0;k<5;++k)
     {array_read(filename);
     sim[i][j]=array[i][k]+array[j][k];
    }
    for(int i=0;i<4;++i)
    {
     for(int j=0;j<4;++j)
     {
     cout<<sim[i][j];
    }
    cout<<endl;
     
    }
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne récupères pas la valeur de retour de array_read(), elle part donc dans le vide.
    De plus, tu devrais sortir l'appel à array_read() de ta boucle: Inutile de relire le fichier à chaque itération...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2020
    Messages : 12
    Par défaut
    Bonjour;

    merci Médinoc pour votre réponse,
    en cherchant sur internet j'ai modifié l'appel de la fonction array_read mais ça marche toujours pas et il m'affiche des erreurs:
    main.cpp invalid initialization of non-const reference of type 'std::istream&' from a temporary of type 'std::ifstream*'
    main.cpp in passing argument 1 of `std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > array_read(std::istream&)'

    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
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    using namespace std;
    vector<vector<double> > array_read(istream &filename);
    vector<vector<double> > array_read(istream &filename)
    {
        //vector< vector<double> >array(cols, std::vector<double>(lines));
        vector< std::vector<double> > array;
        std::vector<double> array_line;
     
        std::string csv_line, word;
        double value;
     
        while ( getline(filename, csv_line) ) {
            array_line.clear();
            std::stringstream ss(csv_line);
     
            std::cout << "line: " << csv_line << std::endl;
     
            while ( getline(ss, word, ';') ) {
                value = strtod(word.c_str(), NULL);
                std::cout << "*) value: " << value << std::endl;
     
                array_line.push_back(value);
            }
     
            array.push_back(array_line);
        }
        return array;
    }
    int main(int argc, char *argv[])
    {
     
        ifstream filename("C:/Users/click/Desktop/exemple.csv");
        if (!filename) {
            std::cerr << "main - error: can't open file " << filename << std::endl;
     
            return EXIT_FAILURE;
        }
     
        int value = 0;
     int val=0;
     double sim[4][5]={0};
     //int lines=4;
     //int cols=5;
     //int array[30][30];
     vector<vector<double> > array=array_read( &filename);
     //array_read(filename);
     for(int i=0;i<4;++i)
     for(int j=0;j<4;++j)
     for(int k=0;k<5;++k)
     {
     sim[i][j]=array[i][k]+array[j][k];
    }
    for(int i=0;i<4;++i)
    {
     for(int j=0;j<4;++j)
     {
     cout<<sim[i][j];
    }
    cout<<endl;
     
    }
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    Alors déjà, rien que la première ligne, c'est suspect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<double> > array_read(istream &filename);
    Un stream, ce n'est pas un nom de fichier, c'est un fichier ouvert. Enfin bon, c'est juste une erreur de nommage, mais ça peut être un symptôme d'une incompréhension.

    La source de ton erreur de compilation, elle est là:
    Code erroné : Sélectionner tout - Visualiser dans une fenêtre à part
     vector<vector<double> > array=array_read( &filename);
    En C++, il y a une différence entre passer un paramètre par référence et passer un pointeur par valeur (il est même possible de passer un pointeur par référence).

    En C++, le passage par référence d'un paramètre de fonction ne nécessite aucun préfixe lors de l'appel (ce qui est une chose que je reproche au C++, car cela rend plus difficile la lecture). Tu peux donc faire ton appel simplement comme ça:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
     vector<vector<double> > array=array_read(filename);

    De plus, le using namespace std; n'est plus recommandé de nos jours.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Voici le code avec 2-3 corrections (réindenté, plus de using namespace, plus de &)
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
     
    std::vector<std::vector<double> > array_read(std::istream &inputFile);
     
    std::vector<std::vector<double> > array_read(std::istream &inputFile)
    {
        //vector< vector<double> >array(cols, std::vector<double>(lines));
        std::vector< std::vector<double> > newArray;
        std::vector<double> array_line;
     
        std::string csv_line, word;
        double value;
     
        while ( std::getline(inputFile, csv_line) ) {
            array_line.clear();
            std::stringstream ss(csv_line);
     
            std::cout << "line: " << csv_line << std::endl;
     
            while ( std::getline(ss, word, ';') ) {
                value = std::strtod(word.c_str(), NULL);
                std::cout << "*) value: " << value << std::endl;
     
                array_line.push_back(value);
            }
     
            newArray.push_back(array_line);
        }
        return newArray;
    }
     
    int main(int argc, char *argv[])
    {
    	std::string fileName("C:/Users/click/Desktop/exemple.csv");
        std::ifstream myFile(fileName.c_str());
        if (!myFile) {
            std::cerr << "main - error: can't open file " << fileName << std::endl;
     
            return EXIT_FAILURE;
        }
     
    	int value = 0;
    	int val=0;
    	double sim[4][5]={0};
    	//int lines=4;
    	//int cols=5;
    	//int array[30][30];
    	auto myArray = array_read(myFile);
    	//array_read(filename);
    	for(int i=0 ; i<4 ; ++i)
    		for(int j=0 ; j<4 ; ++j)
    			for(int k=0 ; k<5 ; ++k)
    			{
    				sim[i][j] = myArray[i][k] + myArray[j][k];
    			}
     
    	for(int i=0 ; i<4 ; ++i)
    	{
    		for(int j=0 ; j<4 ; ++j)
    		{
    			std::cout<<sim[i][j];
    		}
    		std::cout << std::endl;
    	}
     
    	std::system("PAUSE");
    	return EXIT_SUCCESS;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2020
    Messages : 12
    Par défaut
    Bonjour;
    merci Médinoc pour votre aide, le programme s'exécute bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Un script avec une fonction qui lit un fichier
    Par Train55 dans le forum Général Python
    Réponses: 2
    Dernier message: 16/03/2019, 15h26
  2. Réponses: 9
    Dernier message: 02/09/2008, 13h52
  3. Création d'une fonction qui prend en argument une liste de cellule
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2007, 20h49
  4. Réponses: 2
    Dernier message: 13/06/2006, 20h47
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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