如何使用向量 c++ 迭代文件中单词的位置

How to iterate position of the words in a file using vectors c++

本文关键字:单词 位置 文件 迭代 何使用 向量 c++      更新时间:2023-10-16

我必须阅读dictionary.txttest.txt。然后,必须检查test.txt中的每个单词,如果它相等,那么这个单词将被添加到KnownWords容器中,其余的将添加到UnknownWords容器中。到目前为止,我已经做了所有事情。但是,在功能DisplayKnownWordStats()中,我还必须显示单词的位置。我尝试了以下代码,但它没有给我正确的仓位值。

有人可以帮我从test.txt那里获得KnownWords的正确位置.

void WordStats::ReadTxtFile()
{
std::ifstream ifile(Filename);
if (!ifile)
{
std::cerr << "Error Opening file " << Filename << std::endl;
exit(1);
}
for (std::string word; ifile >> word; )
{
transform(word.begin(), word.end(), word.begin(), ::tolower);
WordMap & Words = (Dictionary.count(word) ? KnownWords : UnknownWords);
Words[word].push_back(ifile.tellg());
}
std::cout << KnownWords.size() << " known words read." << std::endl;
std::cout << UnknownWords.size() << " unknown words read." << std::endl;
}
// Displays stats of words in KnownWords
void WordStats::DisplayKnownWordStats()
{
cout << "            ";
cout << "    Word     Count      Position(s)n";
for (Paragraph = KnownWords.begin(); Paragraph != KnownWords.end(); ++Paragraph)
{
string word = (*Paragraph).first;
vector<int> vect = (*Paragraph).second;
int cnt = vect.size();
cout << setw(15) << word << setw(10) << cnt << "   ";
for (int i = 0; i<cnt; i++)
cout << vect[i] << ' ';   // something wrong with this code
cout << endl;
}
}
void WordStats::ReadTxtFile(){
int pos=-1;
string word;
std::ifstream ifile(Filename);
if(!ifile)
{
std::cerr << "Error Opening file " << Filename << std::endl;
exit(1);
}
for (std::string word; ifile >> word;  )
{
transform (word.begin(), word.end(), word.begin(), ::tolower);
word.erase(std::remove_if(word.begin(), word.end(), [](char c)
{
return (c < 'a' || c > 'z') && c != ''' ;
}),  word.end());
if (word == "") continue;
pos++;
if (Dictionary.find(word) != Dictionary.end())
{
Paragraph = KnownWords.find(word);            //adding word to the knownWords
if (Paragraph != KnownWords.end())
{
Paragraph->second.push_back(pos);         //adding position of the word
}         
else 
{
KnownWords[word] = vector<int>(1, pos);   //adding record which is new
}
}
else
{
Paragraph = UnknownWords.find(word);            //adding word to the knownWords
if (Paragraph != UnknownWords.end())
{
Paragraph->second.push_back(pos);          //adding position of the word
}         
else 
{
UnknownWords[word] = vector<int>(1, pos);   //adding record which is new
}
}
}
cout << KnownWords.size() << " known words read." << endl;
cout << UnknownWords.size() << " unknown words read." << endl;
}

void WordStats::DisplayKnownWordsStats()
{
vector<int>::iterator v;
cout << "n";
cout << setw(22) << "Word" << setw(12) << "Count" << setw(20) << "Position(s)"     << endl;
for (Paragraph = KnownWords.begin(); Paragraph != KnownWords.end(); Paragraph++) 
{
string word = (*Paragraph).first;                   
vector<int> vect = (*Paragraph).second;
int count = vect.size();
cout << setw(22) << word << setw(9) << count ;
cout << "            ";
for ( v = vect.begin(); v < vect.end(); v++)
{
cout << *v << " ";
}   
cout << endl;
}
cout << "n";
}
Words[word].push_back(ifile.tellg());

上面ifile.tellg()返回一个单词后的位置。例如,如果文件包含单词"word",则从文件中读取第一个单词,然后ifile.tellg()返回 4。似乎您希望那里的位置为 0。你应该像下面那样做:

Words[word].push_back(ifile.tellg() - word.size());