Domanda

Voglio fare in modo che la riga contrassegnata con // QUESTA LINEA DEVE STAMPARE fare la sua cosa, che è stampare i valori int tra " sinonimi " e " contrari " ;.

Questo è il file di testo:

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;
      }
È stato utile?

Soluzione

Il problema sembra essere qui:

in>>myId>>word;

Su " sinonimi " line l'estrazione di myId non riesce e imposta failbit sullo stream, causando anche il fallimento delle seguenti estrazioni. Devi ripristinare lo stato di controllo degli errori prima di estrarre ulteriori elementi (come la parola "sinonimi") dallo stream:

in.clear();

Altri suggerimenti

Innanzitutto, attiva gli avvisi del compilatore. Potrebbe aiutarti a trovare alcune cose che ritieni siano OK ma che in realtà non lo sono. Ad esempio, le funzioni con tipi di ritorno non void devono sempre restituire qualcosa. In caso contrario, il comportamento del tuo programma è indefinito e il comportamento indefinito include "funzionando esattamente come volevi, salvo qualche sottile differenza più avanti nel programma." Se stai usando g ++, l'opzione per gli avvisi è -Wall .

In secondo luogo, nota che non è solo la linea evidenziata che non è in esecuzione. La intera funzione pushSynonym non viene mai chiamata. La tua classe ha già spiegato come usare il debugger? Se è così, allora considera di usarlo. In caso contrario, prova a mettere un po '" cout " nel tuo programma in modo da poter vedere esattamente fino a che punto arriva il programma prima che vada storto.

In terzo luogo, si noti che quando si verifica un errore di lettura dello stream, viene impostato il bit di errore dello stream. Fino a quando non lo cancelli ( come mostrato dalla risposta di sth ), nessuna ulteriore estrazione può avvenire da quel flusso, quindi tutti gli ulteriori usi di > > e getline falliranno.

Hai eseguito una stampa diagnostica? Ad esempio, che cos'è synsAux.size () ? Hai controllato cosa c'è in synline prima di iniziare l'elaborazione? Hai controllato quali numeri vengono raccolti dal flusso di input?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top