Comprendre un message d'erreur

Fermé
Voking - Modifié le 9 mai 2019 à 16:21
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 14 mai 2019 à 09:11
Bonsoir,
je souhaite écrire un couple de valeurs de type " (x, f(x) ) " dans un fichier, et ce pour un grand nombre de valeurs de x. Ainsi, lors de l'écriture dans le fichier, j'ai écrit la ligne

Graph_Out << "(" << x << ", " << Polynomial(Coeff_Gird,x) << ")" << endl;


avec " Graph_out " la variable ofstream, et " Polynomial(Coeff_Gird,x) " la valeur f(x) provenant d'une fonction "Polynomial" prenant comme paramètre un tableau "Coeff_Gird".

Je me demandais si le fait qu'il y ait plusieurs chevrons " << " sur la ligne de "transcription" du couple de valeurs vers le fichier gênait l'écriture de celui-ci... cependant Code::Blocks ne se plaint pas lorsque j'applique "Build"; peut-être est-ce correct? :)

Ensuite je souhaiterais lire le contenu de mon fichier. Si ma vision de la chose est correcte, je dois sauvegarder le contenu d'une ligne du fichier dans une variable "intermédiaire", pour ensuite la lire grâce à un "cout"... voici ce que j'aurais écrit:

while(Graph_In.good)
       {
           Graph_In >> inter;
           cout << inter << endl;
       }


avec "Graph_In" la variable ifstream, et "inter" la variable pour stocker un court instant la ligne du fichier. Le problème est que je ne sais pas quel type de déclaration utiliser pour "inter" (dans le cas où ma méthode de lecture du fichier est correcte uniquement!). A l'intuition je l'ai déclaré comme un string; mais le message d'erreur suivant apparaît:

 error: cannot convert 'std::basic_ios<_CharT, _Traits>::good<char, std::char_traits<char> >' from type 'bool (std::basic_ios<char>::)() const' to type 'bool'|


Quelle est sa signification? Et quelle est/sont ma/mes fautes? Merci d'avance :p


Voici le morceau de code concerné pour plus de clarté:

ofstream Graph_Out ("Polynomial_Graph.txt", ios::trunc);
   if(Graph_Out.is_open())
   {
        for(double x=-3; x<=3; x+=0.001)
        {
            Graph_Out << "(" << x << ", " << Polynomial(Coeff_Gird,x) << ")" << endl;
        }
        Graph_Out.close();
   }
   else
   {
       cout << "erreur d'ouverture du fichier \" Polynomial_Graph.txt \" " << endl;
       return EXIT_FAILURE;
   }

   // partie facultative: lecture
   ifstream Graph_In ("Polynomial_Graph.txt");
   if(Graph_In.is_open())
   {
        string inter;
       while(Graph_In.good)
       {
           Graph_In >> inter;
           cout << inter << endl;
       }
   }
   else
   {
       cout << "erreur d'ouverture du fichier \" Polynomial_Graph.txt \" " << endl;
       return EXIT_FAILURE;
   }



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.


Merci d'y penser dans tes prochains messages.

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
13 mai 2019 à 11:41
on peut tout à fait enchaîner les
<<
et
>>
sont fait pour ça.
Cela fonctionne tout fait avec les
std::string
sauf que la séquence "
unIStream >> uneString
" ne va extraire qu'un mot pas toute une ligne (comme "%s" en C). Pour gérer une ligne entière il faut utiliser la fonction
std::getline()
comme préconisé par Dal.

Quant au code
while(Graph_In.good)
       {
           Graph_In >> inter;     // ne lit qu'un mot
           cout << inter << endl; // le transforme en ligne
       }
L'erreur vient de parenthèses manquantes,
good
est une fonction. Il faut écrire
while ( Graph_In.good() )
ou même plus simplement
while ( Graph_In ) {
    std::string  inter;
    std::getline( Graph_in , inter );
    std::cout << inter << std::endl;
}

Mais ici le but est de copier tout ce qui provient d'un flux vers un autre. On peut plus simplement écrire à la place
std::cout << Graph_in.rdbuf();
2
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
14 mai 2019 à 09:11
Merci de ces précisions Dalfab :-)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
10 mai 2019 à 09:34
Salut Voking,

Je ne suis pas expert en C++, mais il me semble que les flux istream avec l'opérateur >> peuvent travailler sur les types suivants, parmi lesquels ne figure pas string :

http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

Pour récupérer une string à partir d'un tel flux, tu peux utiliser std::getline :

http://www.cplusplus.com/reference/string/string/getline/

Dal
0