我想让标有//这条线的行应该打印它的东西,它打印“同义词”和“反义词”之间的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;
}
答案 0 :(得分:2)
问题似乎在这里:
in>>myId>>word;
在“同义词”行上,myId
的提取失败并在流上设置failbit
,这导致以下提取也失败。在从流中提取更多元素(如“同义词”一词)之前,您必须重置错误控制状态:
in.clear();
答案 1 :(得分:1)
首先,打开编译器警告。它可能会帮助您找到一些您认为可以但实际上没有的东西。例如,具有非void
返回类型的函数应始终返回一些内容。如果他们不这样做,那么你的程序的行为是未定义的,并且未定义的行为包括“完全按照你想要的方式工作,除了程序后面的一些细微差别。”如果您使用的是g ++,则警告选项为-Wall
。
其次,请注意,不仅仅是突出显示的行未运行。 整个pushSynonyms
函数永远不会被调用。您的课程是否涵盖了如何使用调试器?如果是这样,那么考虑使用它。如果没有,那么尝试在您的程序中添加一些“cout
”语句,这样您就可以确定程序在出错之前到底有多远。
第三,请注意,当发生流读取失败时,将设置流的失败位。在您清除它之前(as shown by sth's answer),该流不会进一步提取,因此>>
和getline
的所有进一步使用都将失败。
答案 2 :(得分:0)
你做过诊断打印吗?例如,synsAux.size()
是什么?在开始处理之前,您是否检查了synline
中的内容?您是否检查过从输入流中收集的数字?