как читать файлы используя контейнеры в STL - PullRequest
0 голосов
/ 08 мая 2018

Мне приходится читать слово за словом из "testdata.txt" и искать те же слова в другом файле "dictionary.txt". Я уже реализовал код для чтения функции "dictionary.txt" in ReadDictionary(). Но я должен реализовать функцию ReadTextFile() public member, чтобы прочитать файл с именем: “testdata.txt” в данные «KnownWords» и «UnknownWords», которые являются частными членами. Только «известные» слова должны быть помещены в «KnownWords», а остальные - в «UnknownWords». Я должен использовать карту и пару, но я не знаю, как использовать это в моем программировании. Может кто-нибудь, пожалуйста, помогите мне понять это, чтобы получить этот вывод:

89 known words read.
49 unknown words read.

int main ():

WordStats ws;
ws.ReadTxtFile();

HeaderFile:

using namespace std;
typedef map<string, vector<int> > WordMap;     
typedef WordMap::iterator WordMapIter;        

class WordStats
{
public:
    WordStats();
    void ReadDictionary();
    void DisplayDictionary();
    void ReadTxtFile();
private:
    WordMap KnownWords;
    WordMap UnknownWords;
    set<string> Dictionary;
    char Filename[256];
};

Это моя программа:

WordStats::WordStats(){
strcpy(Filename,"testdata.txt");
}

// Reads dictionary.txt into Dictionary
void WordStats::ReadDictionary(){
    string word;    
    ifstream infile("dictionary.txt");
    if(!infile)
    {
        cerr << "Error Opening file 'dictionary.txt. " <<endl;
        exit(1);
    }
    while(getline(infile,word))
    {       
        transform (word.begin(), word.end(), word.begin(), ::tolower);
        Dictionary.insert(word); 
    }
    infile.close();
    cout << endl;
    cout << Dictionary.size() << " words read from dictionary. \n" <<endl;

}
// Reads textfile into KnownWords and UnknownWords
void WordStats::ReadTxtFile(){
    string words;
    vector<string> findword;
    vector<int> count;
    ifstream ifile(Filename);
    if(!ifile)
    {
        cerr << "Error Opening file 'dictionary.txt. " <<endl;
        exit(1);
    }
    while(!ifile.eof())
    {
        getline(ifile,words);
        //KnownWords.insert( pair<string,int>( KnownWords, words ) );
        findword.push_back(words);
        Paragraph = KnownWords.find(words);
        //stuck here
    }
    }

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Кажется, вам нужно проверить словарь, чтобы увидеть, содержит ли оно каждое прочитанное вами слово, а затем выбрать, какие из KnownWords и UnknownWords нужно изменить.

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

Затем посмотрите, находится ли оно в Dictionary

        if (Dictionary.count(word))
        {

Запишите положение в KnownWords[word].

            KnownWords[word].push_back(ifile.tellg());
        }
        else
        {

Или в UnknownWords[word].

            UnknownWords[word].push_back(ifile.tellg()); 
        }
    }

Затем выведите size s из них, чтобы получить желаемый результат.

    std::cout << KnownWords.size() << " known words read." << std::endl;
    std::cout << UnknownWords.size() << " unknown words read." << std::endl;
}

Вы можете заменить условный оператор, который дублирует действие, условным выражением.Обратите внимание на тип ссылки в объявлении Words

WordMap & Words = (Dictionary.count(word) ? KnownWords : UnknownWords);
Words[word].push_back(ifile.tellg()); 

В качестве полной функции:

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;
}
0 голосов
/ 08 мая 2018

Прежде всего, вы используете неправильный тип данных WordMap. По моему скромному мнению, это должно быть просто map<string, int>, потому что вы хотите посчитать, сколько раз слово встречается в вашем тексте.

Во-вторых, вы должны читать слова из файла, а не целые строки текста. Вы можете сделать это с помощью следующего кода:

std::string word;
while (ifile >> word) {
    if (Dictionary.find(word) != Dictionary.end()) {
        // WordMap::value_type ... creates instance of std::pair object
        auto it = KnownWords.insert(KnownWords.end(), WordMap::value_type(word, 0));
        it->second++;
    } else {
        auto it = UnknownWords.insert(UnknownWords.end(), WordMap::value_type(word, 0));
        it->second++;
    }
}
...