C ++ en cas d'échec du flux, pourquoi cette ligne ne va-t-elle pas là où elle est censée aller?

StackOverflow https://stackoverflow.com/questions/456357

  •  19-08-2019
  •  | 
  •  

Question

Je souhaite que la ligne marquée avec // CETTE LIGNE DEVRAIT ÊTRE IMPRIMÉE fasse son travail, à savoir imprimer les valeurs int entre "synonymes" et "quot". et "antonymes".

Ceci est le fichier texte:

dictionary.txt

1 cute
2 hello
3 ugly
4 easy
5 difficult
6 tired
7 beautiful
synonyms
1 7
7 1
antonyms
1 3
3 1 7
4 5
5 4
7 3






#include <iostream>
#include <fstream>
#include <string>

#include <sstream>
#include <vector>


using namespace std;

class WordInfo{

      public:

             WordInfo(){}

             ~WordInfo() {     
             }

             int id() const {return myId;}

             void readWords(istream &in)
             {
               in>>myId>>word;     
             }


             void pushSynonyms (string synline, vector <WordInfo> wordInfoVector)

             {

             stringstream synstream(synline);

             vector<int> synsAux;

             int num;

             while (synstream >> num) synsAux.push_back(num);

              for (int i=0; i<synsAux.size(); i++){
              cout<<synsAux[i]<<endl;  //THIS LINE SHOULD BE PRINTING

             }       



             }

             void pushAntonyms (string antline, vector <WordInfo> wordInfoVector)
             {

             }

             //--dictionary output function

             void printWords (ostream &out)
             {
                out<<myId<< " "<<word;     
             }



             //--equals operator for String
             bool operator == (const string &aString)const
             {
                           return word ==aString; 

             }


             //--less than operator

             bool operator <(const WordInfo &otherWordInfo) const
             { return word<otherWordInfo.word;}

             //--more than operator

             bool operator > (const WordInfo &otherWordInfo)const
             {return word>otherWordInfo.word;}

             private:
                   vector <int> mySynonyms;
                   vector <int> myAntonyms;
                   string word;
                   int myId;


      };

      //--Definition of input operator for WordInfo
      istream & operator >>(istream &in, WordInfo &word)
      {
         word.readWords(in); 

      }



      //--Definition of output operator

      ostream & operator <<(ostream &out, WordInfo &word)
      {
            word.printWords(out);  

      }

      int main() {

          string wordFile;
          cout<<"enter name of dictionary file: ";
          getline (cin,wordFile);

          ifstream inStream (wordFile.data());

          if(!inStream.is_open())
          {
          cerr<<"cannot open "<<wordFile<<endl; 
          exit(1);                      

          }

          vector <WordInfo> wordVector; 

          WordInfo aword;



          while (inStream >>aword && (!(aword=="synonyms")))
          {
              wordVector.push_back(aword);      
          }

          int i=0;          
          while (i<wordVector.size()){
                cout<<wordVector[i]<<endl;
                i++;
                }




          vector <int> intVector;
          string aLine; //suspect


          // bad statement?
          while (getline(inStream, aLine)&&(aLine!=("antonyms"))){

                aword.pushSynonyms(aLine, wordVector);

                }




          system("PAUSE");

          return 0;
      }
Était-ce utile?

La solution

Le problème semble être ici:

in>>myId>>word;

Sur les " synonymes " line L'extraction de myId échoue et définit failbit sur le flux, ce qui entraîne également l'échec des extractions suivantes. Vous devez réinitialiser l'état de contrôle des erreurs avant d'extraire d'autres éléments (tels que le mot "synonymes") du flux:

in.clear();

Autres conseils

Commencez par activer les avertissements du compilateur. Cela peut vous aider à trouver certaines choses que vous pensez convenir mais qui ne le sont pas vraiment. Par exemple, les fonctions avec des types de retour autres que void devraient toujours renvoyer quelque chose. Si ce n'est pas le cas, le comportement de votre programme n'est pas défini, et le comportement non défini inclut le fait de "travailler exactement comme vous le souhaitez, sauf quelques différences subtiles plus tard dans le programme". Si vous utilisez g ++, l'option d'avertissement est -Wall .

Deuxièmement, notez que ce n'est pas seulement la ligne en surbrillance qui ne fonctionne pas. La fonction entière pushSynonymes n'est jamais appelée. Votre classe a-t-elle déjà expliqué comment utiliser le débogueur? Si c'est le cas, envisagez de l'utiliser. Sinon, essayez de placer des " cout " instructions dans votre programme afin que vous puissiez voir exactement jusqu'où votre programme va avant qu'il ne tourne mal.

Troisièmement, notez que lorsqu'un échec de lecture de flux se produit, le bit d'échec du flux est défini. Jusqu'à ce que vous l'effaciez ( comme le montre la réponse de sth ), aucune extraction supplémentaire ne peut avoir lieu à partir de ce flux. Par conséquent, toutes les utilisations ultérieures de > et de getline échoueront.

Avez-vous effectué une impression de diagnostic? Par exemple, qu'est-ce que synsAux.size () ? Avez-vous vérifié le contenu de synline avant de commencer le traitement? Avez-vous vérifié quels numéros sont collectés à partir du flux d'entrée?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top