Как перебрать положение слов в файле, используя векторы c ++ - PullRequest
0 голосов
/ 10 мая 2018

Я должен прочитать dictionary.txt и test.txt. Затем необходимо проверить каждое слово в test.txt, если оно равно, тогда это слово будет добавлено в контейнер KnownWords, а оставшееся будет в UnknownWords контейнере. Я сделал все до сих пор. Но в функции DisplayKnownWordStats() мне также нужно отобразить положение слов. Я попробовал следующий код, но он не дает мне правильное значение позиций.

Может кто-нибудь помочь мне, чтобы получить правильную позицию KnownWords с test.txt.

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;
    }
}

Ответы [ 2 ]

0 голосов
/ 07 августа 2018
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";
}
0 голосов
/ 11 мая 2018
Words[word].push_back(ifile.tellg());

Выше ifile.tellg() возвращает позицию после слова. Например, если файл содержит слово «слово», вы читаете первое слово из файла, тогда ifile.tellg() возвращает 4. Кажется, вы ожидаете позицию 0 там. Вы должны сделать, как показано ниже:

Words[word].push_back(ifile.tellg() - word.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...