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
bonjour,
j'ai un problème avec l'affichage d'un fichier txt qui contient que des valeurs sous forme d'un tableau de 9 colonnes et 201 lignes.
je ne comprend pas pourquoi le fichier s'affiche en commençant par la 39ème ligne.
je vous donne le code que j'ai utilisé
Merci de bien vouloir m'éclairer et si possible apporter des améliorations

string file ="matS.txt";
string data = " ";
ifstream mfile(file.c_str());//ouverture du fichier
if(!mfile)data = "erreur";
else
{stringstream buffer;
// lecture de tout le fichier
buffer << mfile.rdbuf();
// fermeture du fichier
mfile.close();
// recuperation du contenu dans un string
data = buffer.str();
}


cout << data << endl;

je vous donne aussi quelques lignes de mon fichier txt

1.000000e9 5.603425e-3 -6.490413e-2 9.783111e-1 -1.740100e-1 9.758739e-1 -1.826534e-1 -1.891823e-2 -6.229049e-2
1.085000e9 6.921810e-3 -7.092675e-2 9.727001e-1 -1.878764e-1 9.719810e-1 -1.965761e-1 -2.128138e-2 -6.827045e-2
1.170000e9 7.692728e-3 -7.763414e-2 9.692169e-1 -2.018745e-1 9.675217e-1 -2.105517e-1 -2.501053e-2 -7.557128e-2
1.255000e9 8.317075e-3 -8.545595e-2 9.647463e-1 -2.153868e-1 9.622218e-1 -2.243890e-1 -2.791875e-2 -8.142246e-2

je vous remercie de bien vouloir m'aider car je ne comprends pas
c très urgent
A voir également:

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
Ca se fait très bien en C++, pas besoin de passer par du C.
#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
2
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
pourquoi tu n'utilise pas quelque fonction de c et pas de c++;
c-a-d pour ouvrir un fichier utilise fopen();
1
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
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).
1
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
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
1

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
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
1
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
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
0
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
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 :
#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
1
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
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
0
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
Je ne pense pas que ça vienne de la. Concrètement il affiche quoi ton programme quand tu le lances ?
1
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
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.
1
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
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
./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
1