Comprendre un message d'erreur

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

  1. 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
    1. Contributeur
      Merci de ces précisions Dalfab :-)
      0