C ++ ifstream fail, почему эта строка не идет туда, куда должна? - PullRequest
0 голосов
/ 19 января 2009

Я хочу, чтобы строка, помеченная символом // ЭТА ЛИНИЯ, ДОЛЖНА БЫТЬ ПЕЧАТЬ, выполняет свою функцию - выводит значения int между "синонимами" и "антонимами".

Это текстовый файл:

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;
      }

Ответы [ 3 ]

2 голосов
/ 19 января 2009

Кажется, проблема здесь:

in>>myId>>word;

В строке «синонимы» извлечение myId завершается неудачно и устанавливает failbit в потоке, что также приводит к сбою следующих извлечений. Вы должны сбросить состояние контроля ошибок, прежде чем извлекать дополнительные элементы (например, слово «синонимы») из потока:

in.clear();
1 голос
/ 19 января 2009

Сначала включите предупреждения компилятора. Это может помочь вам найти некоторые вещи, которые вы считаете нормальными, но на самом деле это не так. Например, функции с типами, отличными от void, всегда должны возвращать что-то. Если они этого не делают, то поведение вашей программы не определено, и неопределенное поведение включает в себя «работу именно так, как вы хотели, за исключением некоторой тонкой разницы позже в программе». Если вы используете g ++, опция для предупреждений: -Wall.

Во-вторых, обратите внимание, что не только выделенная строка не работает. вся pushSynonyms функция никогда не вызывается. Ваш класс уже рассмотрел, как использовать отладчик? Если так, то подумайте об этом. Если нет, попробуйте добавить в вашу программу несколько операторов "cout", чтобы вы могли точно увидеть, как далеко продвигается ваша программа, прежде чем она пойдет не так.

В-третьих, обратите внимание, что при сбое чтения потока устанавливается бит сбоя потока. Пока вы не очистите его (, как показано в ответе sth ), дальнейшее извлечение из этого потока не может быть выполнено, поэтому дальнейшее использование >> и getline завершится неудачей.

0 голосов
/ 19 января 2009

Вы делали какую-либо диагностическую печать? Например, что такое synsAux.size()? Вы проверили, что находится в synline, прежде чем начать его обработку? Вы проверили, какие числа собираются из входного потока?

...