falha ifstream C ++, porque é que esta linha não indo onde é suposto?
Pergunta
Eu quero fazer a linha marcada com // Esta linha deve estar imprimindo fazer a sua coisa, que é imprimir os valores int entre "sinônimos" e "antônimos".
Este é o arquivo 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;
}
Solução
O problema parece ser aqui:
in>>myId>>word;
Na linha "sinônimos" a extração de myId
falha e conjuntos failbit
no fluxo, o que faz com que os seguintes extrações para também falhar. Você tem que repor o estado de controle de erros antes de extrair elementos adicionais (como a palavra "sinônimos") a partir do fluxo:
in.clear();
Outras dicas
Primeiro, ligue avisos do compilador. Pode ajudá-lo a encontrar algumas coisas que você acha que são OK, mas que realmente não são. Por exemplo, as funções com tipos de retorno não void
sempre deve retornar algo. Se não o fizerem, então o comportamento do seu programa é indefinido, e um comportamento indefinido inclui "trabalhar exatamente como você queria, com exceção de alguns sutil diferença mais tarde no programa." Se você estiver usando g ++, a opção para avisos é -Wall
.
Em segundo lugar, nota que não é apenas a linha destacou que não está em execução. O função pushSynonyms
toda nunca é chamado. Tem o seu ramo cobertos como usar o depurador ainda? Se assim for, então considerar a usá-lo. Se não, então tente colocar algumas declarações "cout
" em seu programa para que você possa ver exatamente o quão longe o seu programa começa antes que ele vai mal.
Em terceiro lugar, nota que, quando uma falha fluxo de leitura ocorre, os do fluxo falhar bit é definido. Até que você limpá-la ( como mostra de sth resposta ), sem extração ainda pode ocorrer a partir desse fluxo, de modo que todas as outras utilizações de >>
e getline
irá falhar.
Você fez qualquer impressão de diagnóstico? Por exemplo, o que é synsAux.size()
? Você verificou o que está em synline
antes de começar a processá-lo? Você verificou que os números são recolhidos a partir do fluxo de entrada?