C++ C+中非常具体的语法分析+;

C++ C+中非常具体的语法分析+;,c++,parsing,ifstream,stringstream,C++,Parsing,Ifstream,Stringstream,基本上,我试着读入一个文件中的单词,不用标点符号,把每个单词读入一个多重映射,然后插入一个向量,每对都是一个单词,找到单词的文件行。我有删除标点符号的功能,可以很好地工作,而且我相当确定我的插入代码工作正常,但我似乎无法绕过行号部分。我的代码中包含了这一部分,如下所示: ifstream in("textfile.txt"); string line; string keys; stringstream keystream; int line_number = 1; while (getline

基本上,我试着读入一个文件中的单词,不用标点符号,把每个单词读入一个多重映射,然后插入一个向量,每对都是一个单词,找到单词的文件行。我有删除标点符号的功能,可以很好地工作,而且我相当确定我的插入代码工作正常,但我似乎无法绕过行号部分。我的代码中包含了这一部分,如下所示:

ifstream in("textfile.txt");
string line;
string keys;
stringstream keystream;
int line_number = 1;
while (getline(in, line, '\n')) {
        alphanum(line);


        keystream << line;


        while(getline(keystream, keys, ' ')) 
            table.insert(keys, line_number); //this just inserts the pair into my  vector (table is an instance of a class I created)
        keystream.str("");


        line_number++;
}
ifstream-in(“textfile.txt”);
弦线;
字符串键;
串流键流;
int line_number=1;
while(getline(in,line,'\n')){
alphanum(行);

keystream不要保留字符串流对象;只需在每一轮中创建一个新对象:

string line;
while (getline(in, line, '\n'))
{
    alphanum(line);
    istringstream keystream(line);

    string keys;
    while (getline(keystream, keys, ' '))  // or even "while (keystream >> keys)"
    {

    }
}

我认为问题在于,第二个getline()循环在stringstream上设置了EOF标志,而当您调用str()时,这个标志没有被清除。您还需要在“keystream”上调用.clear()。

看起来这两个答案都有效。谢谢大家!我尝试了.clear()我记得几年前有过这个问题,我曾经通过循环的每次迭代重新创建
stringstream
,直到我发现可以清除EOF标志。