Affichage d'un fichier.txt en C++ (SOS)
Fermé
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
-
18 juin 2007 à 17:17
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 20 juin 2007 à 20:35
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 20 juin 2007 à 20:35
A voir également:
- Affichage d'un fichier.txt en C++ (SOS)
- Affichage double ecran - Guide
- Windows 11 affichage classique - Guide
- Modifier affichage heure iphone - Guide
- Affichage conditionnel excel - Guide
- Excel bug affichage ✓ - Forum Excel
9 réponses
mamiemando
Messages postés
33077
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2024
7 748
19 juin 2007 à 08:53
19 juin 2007 à 08:53
Ca se fait très bien en C++, pas besoin de passer par du C.
Ce qui donne à la compilation et à l'exécution :
Note : c'est une mauvaise idée de stocker tout le fichier dans data comme tu as fait car si le fichier est très volumineux, tu vas stocker tout ce fichier en mémoire dans cette chaîne de caractère. Dans la version que je te propose tu ne stockes qu'une ligne en mémoire. La ligne peut ensuite être aisément être parsée avec un sscanf ou un std::istringstream, ou encore mieux, par une expression régulière (cf lib pcre)
Bonne chance
#include <fstream> #include <iostream> #include <string> int main(){ const char *filename = "plop.txt"; std::ifstream ifs(filename); if(!ifs){ std::cerr << "Le fichier [" << filename << "] n'existe pas" << std::endl; return 1; } std::string line; while(std::getline(ifs,line)) std::cout << line << std::endl; ifs.close(); return 0; }
Ce qui donne à la compilation et à l'exécution :
(mando@cenedra) (~) $ g++ -W -Wall plop.cpp (mando@cenedra) (~) $ cat plop.txt 1 2 3 4 5 6 7 8 9 10 11 12 (mando@cenedra) (~) $ ./a.out 1 2 3 4 5 6 7 8 9 10 11 12
Note : c'est une mauvaise idée de stocker tout le fichier dans data comme tu as fait car si le fichier est très volumineux, tu vas stocker tout ce fichier en mémoire dans cette chaîne de caractère. Dans la version que je te propose tu ne stockes qu'une ligne en mémoire. La ligne peut ensuite être aisément être parsée avec un sscanf ou un std::istringstream, ou encore mieux, par une expression régulière (cf lib pcre)
Bonne chance
eyeofthetiger
Messages postés
5
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
8 juin 2008
1
18 juin 2007 à 17:30
18 juin 2007 à 17:30
pourquoi tu n'utilise pas quelque fonction de c et pas de c++;
c-a-d pour ouvrir un fichier utilise fopen();
c-a-d pour ouvrir un fichier utilise fopen();
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
3
19 juin 2007 à 09:28
19 juin 2007 à 09:28
merci bcp, je vais le tester
je voudrais savoir comment je pourrais utiliser ces valeurs pour tracer une courbe en polaire
Au fait, mon tableau présente pour chaque point une partie réelle et une partie imaginaire (2 colonnes).
je voudrais savoir comment je pourrais utiliser ces valeurs pour tracer une courbe en polaire
Au fait, mon tableau présente pour chaque point une partie réelle et une partie imaginaire (2 colonnes).
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
3
19 juin 2007 à 09:39
19 juin 2007 à 09:39
je l'ai testé ton code, l'affichage est nikel mais le pb est que la lecture ne se fait pas dès la première ligne, je cherche à l'améliorer mais je ne suis pas une lumière
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33077
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2024
7 748
20 juin 2007 à 08:51
20 juin 2007 à 08:51
Heu si chez moi ça lit dès la première ligne.
Pour tracer une courbe polaire le mieux c'est d'utiliser gnuplot.
http://www.celles.net/wiki/Erreur404
C'est un programme qui existe sous linux et sous cygwin qui permet de tracer des courbes, notamment polaires.
Bonne chance
Pour tracer une courbe polaire le mieux c'est d'utiliser gnuplot.
http://www.celles.net/wiki/Erreur404
C'est un programme qui existe sous linux et sous cygwin qui permet de tracer des courbes, notamment polaires.
Bonne chance
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
3
20 juin 2007 à 09:23
20 juin 2007 à 09:23
ok merci, je vais essayer de revoir ça, est ce possible d'afficher les 9 colonnes
parce que ça me remet les valeurs à la ligne car la fenêtre n'est pas très grande donc je n'ai plus vraiment mon tableau?
je travaille sur Visual C++.NET
merci pour ton lien
On vient de me dire que je pouvais utiliser MATLAB
parce que ça me remet les valeurs à la ligne car la fenêtre n'est pas très grande donc je n'ai plus vraiment mon tableau?
je travaille sur Visual C++.NET
merci pour ton lien
On vient de me dire que je pouvais utiliser MATLAB
mamiemando
Messages postés
33077
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2024
7 748
20 juin 2007 à 10:26
20 juin 2007 à 10:26
Pour Matlab : c'est pas libre et c'est plus lent, mais ça peut être plus pratique selon ce que tu as à faire.
Pour l'affichage : malheureusement c'est indépendant du programme, ça vient de ta console.
Sous Visual, normalement tu dois avoir un bouton "run" qui exécute ton programme dans une console intégrée dans ton environnement de développement et qui est redimensionnable (enfin je suppose), tu n'es pas obligé de lancer ton programme dans une console ms-dos.
Une piste : Si tu veux tu peux installer cygwin (une sorte de distribution linux pour windows) et là tu auras une console (xterm) digne de ce nom. Tu n'auras même plus besoin de visual C++ puisque cygwin fournit un compilateur (g++). Tu peux aussi utiliser octave (qui est un équivalent libre de matlab).
Pour lire ta matrice en C++, voici le code que je te propose :
Dans la partie du code qui affiche la matrice tu vois qu'il est très facile d'accéder aux éléments de ta matrice.
Bonne chance
Pour l'affichage : malheureusement c'est indépendant du programme, ça vient de ta console.
Sous Visual, normalement tu dois avoir un bouton "run" qui exécute ton programme dans une console intégrée dans ton environnement de développement et qui est redimensionnable (enfin je suppose), tu n'es pas obligé de lancer ton programme dans une console ms-dos.
Une piste : Si tu veux tu peux installer cygwin (une sorte de distribution linux pour windows) et là tu auras une console (xterm) digne de ce nom. Tu n'auras même plus besoin de visual C++ puisque cygwin fournit un compilateur (g++). Tu peux aussi utiliser octave (qui est un équivalent libre de matlab).
Pour lire ta matrice en C++, voici le code que je te propose :
#include <fstream> #include <iostream> #include <string> #include <cstdio> #include <vector> // Une classe de matrice pleine template <typename T> class matrix_t : public std::vector<std::vector<T> >{ public: inline unsigned get_nb_row() const{ return this->size(); } inline unsigned get_nb_col() const{ return (this->size() == 0 ? 0 : (*this)[0].size()); } }; /** * \brief Lit un fichier tabulé de doubles (9 par ligne) * \param ifs Le fichier à lire * \return La matrice lue */ matrix_t<double> read_matrix_file(std::ifstream & ifs){ matrix_t<double> matrix; std::string line; for(unsigned no_line=1;std::getline(ifs,line);++no_line){ // Parser la ligne courante std::vector<double> row(9); if(sscanf(line.c_str()," %lf %lf %lf %lf %lf %lf %lf %lf %lf ", &row[0],&row[1],&row[2],&row[3],&row[4], &row[5],&row[6],&row[7],&row[8] ) == 9){ matrix.push_back(row); }else{ std::cerr << "ligne " << no_line << ": " << line << std::endl << "nombre de valeurs invalides, ligne ignorée" << std::endl; continue; } } return matrix; } int main(){ // Lire le fichier matrix_t<double> matrix; { const char *filename = "plop.txt"; std::ifstream ifs(filename); if(!ifs){ std::cerr << "Le fichier [" << filename << "] n'existe pas" << std::endl; return 1; } matrix = read_matrix_file(ifs); ifs.close(); } // Afficher la matrice { unsigned nb_col = matrix.get_nb_col(); unsigned nb_row = matrix.get_nb_row(); for(unsigned i=0;i<nb_row;++i){ for(unsigned j=0;j<nb_col;++j){ std::cout << matrix[i][j] << '\t'; } std::cout << std::endl; } } return 0; }
Dans la partie du code qui affiche la matrice tu vois qu'il est très facile d'accéder aux éléments de ta matrice.
Bonne chance
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
3
20 juin 2007 à 10:48
20 juin 2007 à 10:48
je te remercie encore pour ton code
je pense que mon pb vient du fait kil n'ya pas assez d'espace alloué à mon fichier car pendant la lecture je vois bien les premieres valeurs mais jusqu'à la fin de mon fichier, je ne peux que voir une partie de mon fichier. pourtant mon fichier ne fait que 25KO
je suis désolée de t'embèter
je pense que mon pb vient du fait kil n'ya pas assez d'espace alloué à mon fichier car pendant la lecture je vois bien les premieres valeurs mais jusqu'à la fin de mon fichier, je ne peux que voir une partie de mon fichier. pourtant mon fichier ne fait que 25KO
je suis désolée de t'embèter
mamiemando
Messages postés
33077
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2024
7 748
20 juin 2007 à 11:00
20 juin 2007 à 11:00
Je ne pense pas que ça vienne de la. Concrètement il affiche quoi ton programme quand tu le lances ?
malouve
Messages postés
56
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
20 juillet 2010
3
20 juin 2007 à 15:42
20 juin 2007 à 15:42
il me lit le fichier en totalité mais lorsque je remonte pour voir les premieres valeurs, je me rends compte kel n'y a plu les premieres valeurs, comme ci la place allouer en mémoire n'est pas suffisante pour les afficher.
mamiemando
Messages postés
33077
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 avril 2024
7 748
20 juin 2007 à 20:35
20 juin 2007 à 20:35
Encore une fois ca ne vient pas du programme mais de ta console qui ne garde qu'un nombre limité de ligne en mémoire. Sous linux tu peux mettre en "pause" le déroulement du programme à chaque fois que la console est remplie (sous windows je ne sais pas comment faire). Par exemple si ton exécutable s'appelle plop.exe ça donnerait sous linux
Une solution serait de rediriger l'affichage dans un fichier, par exemple log.txt (et ça, ça marche sous windows aussi). Sous linux :
Sous windows :
Il suffit ensuite d'ouvrir ce fichier avec un éditeur texte.
Bonne chance
./plop.exe | more
Une solution serait de rediriger l'affichage dans un fichier, par exemple log.txt (et ça, ça marche sous windows aussi). Sous linux :
./plop.exe > log.txt
Sous windows :
plop.exe > log.txt
Il suffit ensuite d'ouvrir ce fichier avec un éditeur texte.
Bonne chance