C ++ ifstream failure, ¿por qué esta línea no va a donde se supone que debe ir?

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Quiero hacer que la línea marcada con // ESTA LÍNEA DEBE IMPRIMIR haga lo suyo, que es imprimir los valores int entre " sinónimos " y "antónimos".

Este es el archivo de texto:

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;
      }
¿Fue útil?

Solución

El problema parece estar aquí:

in>>myId>>word;

En los " sinónimos " la extracción de myId alinea la línea y establece failbit en la secuencia, lo que hace que las siguientes extracciones también fallen. Debe restablecer el estado de control de errores antes de extraer más elementos (como la palabra " sinónimos ") de la secuencia:

in.clear();

Otros consejos

Primero, active las advertencias del compilador. Puede ayudarte a encontrar algunas cosas que crees que están bien pero que realmente no lo están. Por ejemplo, las funciones con tipos de retorno no void siempre deben devolver algo. Si no lo hacen, entonces el comportamiento de su programa es indefinido, y el comportamiento indefinido incluye "trabajar exactamente como lo deseaba, excepto por alguna diferencia sutil más adelante en el programa". Si está utilizando g ++, la opción de advertencias es -Wall .

Segundo, tenga en cuenta que no solo la línea resaltada no se está ejecutando. Nunca se llama a la función pushSynimony completa. ¿Ya ha cubierto su clase cómo usar el depurador? Si es así, entonces considere usarlo. Si no es así, intente poner un poco de cout " declaraciones en su programa para que pueda ver exactamente qué tan lejos llega su programa antes de que salga mal.

Tercero, tenga en cuenta que cuando ocurre una falla de lectura de flujo, se establece el bit de falla del flujo. Hasta que lo borre ( como se muestra en la respuesta de sth ), no se pueden realizar más extracciones de esa secuencia, por lo que todos los usos adicionales de > > y getline fallarán.

¿Ha realizado alguna impresión de diagnóstico? Por ejemplo, ¿qué es synsAux.size () ? ¿Ha verificado lo que hay en synline antes de comenzar a procesarlo? ¿Ha verificado qué números se recopilan de la secuencia de entrada?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top