C ++ en cas d'échec du flux, pourquoi cette ligne ne va-t-elle pas là où elle est censée aller?
Question
Je souhaite que la ligne marquée avec // CETTE LIGNE DEVRAIT ÊTRE IMPRIMÉE fasse son travail, à savoir imprimer les valeurs int entre "synonymes" et "quot". et "antonymes".
Ceci est le fichier texte:
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;
}
La solution
Le problème semble être ici:
in>>myId>>word;
Sur les " synonymes " line L'extraction de myId
échoue et définit failbit
sur le flux, ce qui entraîne également l'échec des extractions suivantes. Vous devez réinitialiser l'état de contrôle des erreurs avant d'extraire d'autres éléments (tels que le mot "synonymes") du flux:
in.clear();
Autres conseils
Commencez par activer les avertissements du compilateur. Cela peut vous aider à trouver certaines choses que vous pensez convenir mais qui ne le sont pas vraiment. Par exemple, les fonctions avec des types de retour autres que void
devraient toujours renvoyer quelque chose. Si ce n'est pas le cas, le comportement de votre programme n'est pas défini, et le comportement non défini inclut le fait de "travailler exactement comme vous le souhaitez, sauf quelques différences subtiles plus tard dans le programme". Si vous utilisez g ++, l'option d'avertissement est -Wall
.
Deuxièmement, notez que ce n'est pas seulement la ligne en surbrillance qui ne fonctionne pas. La fonction entière pushSynonymes
n'est jamais appelée. Votre classe a-t-elle déjà expliqué comment utiliser le débogueur? Si c'est le cas, envisagez de l'utiliser. Sinon, essayez de placer des " cout
" instructions dans votre programme afin que vous puissiez voir exactement jusqu'où votre programme va avant qu'il ne tourne mal.
Troisièmement, notez que lorsqu'un échec de lecture de flux se produit, le bit d'échec du flux est défini. Jusqu'à ce que vous l'effaciez ( comme le montre la réponse de sth ), aucune extraction supplémentaire ne peut avoir lieu à partir de ce flux. Par conséquent, toutes les utilisations ultérieures de >
et de getline
échoueront.
Avez-vous effectué une impression de diagnostic? Par exemple, qu'est-ce que synsAux.size ()
? Avez-vous vérifié le contenu de synline
avant de commencer le traitement? Avez-vous vérifié quels numéros sont collectés à partir du flux d'entrée?