|
|
|
|
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
Configuration: Windows XP Firefox 2.0.0.4
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 |
Heu si chez moi ça lit dès la première ligne.
|
Pour Matlab : c'est pas libre et c'est plus lent, mais ça peut être plus pratique selon ce que tu as à faire.
#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
|
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 |