Lire dans un fichier texte ligne par ligne et mot par mot

Signaler
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006
-
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
-
Bonsoir,

Je suis debutant, je dois faire un script qui va lire un fichier texte pour ensuite trouver quel personne a la meilleur, plus basse note et de faire la moyenne de la classe.

Le format du fichier texte est la suivante (data.txt):

christophe 15
marc 7
olivier 13
stan 14.7
stephanie 14
julie 15
andrew 9
suzanne 15.25


Mon fichier cpp ressemble à ca(basic_stats.cpp):

#include 
#include <stdio.h>
#include <math.h>
#include <fstream>

using namespace std;
using std::cin;
using std::cout;
using std::endl;
using std::string;


int main(void)
{
    string nom[8]; //8 pour le nombre de personne 
    int i = 0;
    std::ifstream data;
    fichier.open("data.txt","r",stdin); //lecture du fichier
   
    while (!data.eof());
    do
    {
    cout << nom[i] <<endl;
    ++i;
    }
    return 0;
}



J'ai essayé de faire ca avec quelques script que j'ai vu mais ca ne passe pas.

L'erreur est la suivante:

$ make basic_stats
g++ -W -Wall -Werror -O2 basic_stats.cpp -o basic_stats
basic_stats.cpp: In function `int main()':
basic_stats.cpp:28: error: `fichier' undeclared (first use this function)
basic_stats.cpp:28: error: (Each undeclared identifier is reported only once
for each function it appears in.)
basic_stats.cpp:28: error: syntax error before `)' token
basic_stats.cpp:36: error: syntax error before `return'
make: *** [basic_stats] Error 1


Voila, merci pour votre aide.

10 réponses

Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

Je rectifie :

le fichier est passé en entrée standart avec " < data.text" lors de l'execution.

Avec de l'aide d'un ami, j'ai pu lire et affiche le dernier nombre (15.25)avec environ 7 sauts de ligne. Or je voudrai prendre en variable les noms et les notes de tout le monde???

voila ce que ressemble mon script:

#include 
#include <stdio.h>
#include <math.h>
#include <fstream>
#include <string>

using namespace std;
using std::cin;
using std::cout;
using std::endl;
using std::string;


int main(void)
{
    string nom[8];  
    int i = 0;  
    string bop;    

    while (cin >> bop)
    {nom[i]=bop; 

    }

    while (i<8)
    {
     cout <<  nom[i] << endl;
     ++i;
    }
    return 0;
}



Voila, help please :-)
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
Bonjour,

alors un petit coup de main pour l'effort ;)



#include

//#include <stdio.h> // inutile

//#include <math.h> // inutile ou #include <cmath>

//#include <fstream> // inutle si tu n'ouvres pas de fichier

#include <string>



using namespace std;

//using std::cin;

//using std::cout;

//using std::endl;

//using std::string;

// Tous les using sont inutiles si tu "ouvres" tout le namespace

// en faisant le using namespace std; comme tu le fais





int main(void)

{

string nom[8];

int i = 0; // il manquait un ;

// string bop; // ne sert à rien puisque tu as déjà le tableau

// par contre où sont les notes ?

double notes[8];

// à éviter les contantes en dures... (genre le 8)

// au pire utilise des vector



// while (cin >> bop)

// il faut lire le nom puis la note l'un après l'autre sinon

// si tu vas avoir des erreurs de lecture et pas mal de chaine vide

while( cin >> nom[i] >> notes[i] )

{

// nom[i]=bop;

// ne sert pas

++i;

// il suffit de changer l'index où tu vas placer

// le nouveau nom et la nouvelle note

// il faudrait controler le dépassement sur +8 valeurs

}



/*

while (i<8)

{

cout << nom[i] << endl;

++i;

}

*/

// pk pas une simple boucle ?

for (int i = 0; i < 8; ++i )

cout << nom[i] << " : " << notes[i] << endl;



// remarque : ce serait de distinguer le i contenant

// le nombre de lecture du i pour la boucle.



// return 0;

// le return 0; est inutile en C++ pour le main

}

Ma participation à la saturation du net:
http://hylvenir.free.fr
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

Merci pour ton aide, ca marche impec.

Mais c'est juste une partie de mon travail helas. je devrai m'en sortir ( je pense :-) ).



Merci encore,
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

Juste une derniere question, je comprends pas ce pobleme j'arrive a
afficher le plus petite note mais la personne n'est pas la bonne.



int man (void)

{

string nom[8];

int i = 0;

double max = 0;

double min = 20;

double not[8];

double moy = 0;



while (cin >> nom[i] >> note[i] )

{

++i;

}



string nommax;

string nommin;



for ( int i = 0 ; i < 8 ; ++i )

{

if ( note[i] > max )

max = note[i];

nommax= nom[i];

if ( note[i] < min )

min = note[i];

nommin =
nom[i];
// ICI !!!!???

moy += note[i];

}

moy /= i;

cout << "Best: " << nommax << " " << "(" << max << ")" << endl;

cout << "Worst: " << nommin << " "
<< "(" << min << ")" << endl;

cout << "Average: " << moy << endl;

}



Elle m'affiche Zuzanne pour la petite note or ca devrait etre marc???!!!



Merci encore,
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
Il manque les accolades pour tes if


if ( note[i] > max )

{

max = note[i];

nommax= nom[i];

}

if ( note[i] < min )

{

min = note[i];

nommin =
nom[i];
// ICI !!!!???

}



sinon tu n'as pas besoin de sauvegarder les valeurs mais juste l'index sur les valeurs du tableau.



if ( note[i] > note[indexMax] )

indexMax = i;



if ( note[i] < note[indexMin] )

indexMin = i;




Ma participation à la saturation du net:
http://hylvenir.free.fr
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

Merci j'avais pas vu :)



Une derniere question : si on auriait pas connu le nombre de lignes
(nom[8]), fallait-il utiliser dans ce cas un "cin.eof"???s'il existe lol



exemple:



do { cin >> nom[i] >> note[i];

++i; }

while (cin.eof)





Merci encore pour tout!!!!
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
Non pas besoin



le while( cin >>... )

++i;



suffit

s'il n'y a plus de lignes, ce qu'il y a dans le while renvoit false.

Tu peux faire l'essai si tu veux.


Ma participation à la saturation du net:
http://hylvenir.free.fr
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

Rebonjour,



J'ai oublié une derniere requete a faire dans mon script:

quand on tape "./basic_stats < /dev/null" , il devrait rien m'afficher. Or ca me donne des resultats (bizarre)



ex:

$ ./basic_stats < /dev/null

Best : (4.8653e-270)

Worst: (-1.99918)

Average: -inf



au lieu de :

$ ./basic_stats < /dev/null

$



J'ai essayer de faire un test avant mon while avec un :

if (cin = = null) ou if (cin = = "") pour ne rien afficher mais en vain.



C'est avec un break ou return qu'on quitte un programme?



Merci infiniment,
Messages postés
17
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
24 août 2006

up,
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
c'est juste que tu n'initialises pas tes variables (notes, min, max par exemple) au départ.


Ma participation à la saturation du net:
http://hylvenir.free.fr