Frage

Ich mag die Zeile mit // der Linie markierten Bereich machen, sollen Sie PRINTING nicht sein Ding, der Druck des int-Wert zwischen „Synonyme“ und „Antonyme“.

Dies ist die Textdatei:

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;
      }
War es hilfreich?

Lösung

Das Problem scheint hier zu sein:

in>>myId>>word;

Auf der „Synonyme“ -Linie die Extraktion von myId versagt und setzt failbit auf dem Strom, der die folgenden Extraktionen verursacht auch zum Scheitern verurteilt. Sie haben den Fehlersteuerzustand zurückgesetzt werden, bevor weitere Elemente Extrahieren (wie das Wort „Synonyme“) aus dem Strom:

in.clear();

Andere Tipps

Aktivieren Sie zunächst Compiler-Warnungen. Es kann Ihnen helfen, einige Dinge, die Sie denken, sind in Ordnung, aber das ist wirklich nicht. Zum Beispiel Funktionen mit nicht-void Rückgabetypen sollten immer etwas zurück. Wenn sie dies nicht tun, dann Verhalten Ihres Programms ist nicht definiert, und nicht definiertes Verhalten beinhaltet „arbeiten genau, wie man wollte, mit Ausnahme einiger feinen Unterschied später im Programm.“ Wenn Sie g ++ verwenden, ist die Option für Warnungen -Wall.

Zweitens beachten Sie, dass es nicht nur die markierte Zeile ist, die nicht ausgeführt wird. Die gesamte pushSynonyms Funktion wird nie aufgerufen. Hat Ihre Klasse abgedeckt, wie das Debugger noch benutzen? Wenn ja, dann sollten Sie es. Wenn nicht, dann versuchen einige „cout“ Anweisungen in Ihrem Programm setzen, so dass Sie genau sehen können, wie weit Ihr Programm bekommt, bevor es schief geht.

Drittens beachten Sie, dass, wenn ein Stromlesefehler auftritt, der nicht Stream-Bit gesetzt ist. Bis Sie es deaktivieren ( als etw Antwort ), keine weitere Extraktion aus diesem Strom kann auftreten, gezeigt, so dass alle weiteren Verwendungen von >> und getline werden fehlschlagen.

Haben Sie irgendeine Diagnose Druck gemacht? Zum Beispiel, was ist synsAux.size()? Haben Sie überprüft, was in synline ist, bevor Sie mit der Bearbeitung begonnen? Haben Sie überprüft, welche Zahlen aus dem Eingangsstrom gesammelt werden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top