C++ 如何在STL中使用容器读取文件

C++ 如何在STL中使用容器读取文件,c++,class,dictionary,stl,keyvaluepair,C++,Class,Dictionary,Stl,Keyvaluepair,我必须逐字阅读“testdata.txt”,并在另一个文件“dictionary.txt”中查找相同的单词。我已经实现了在ReadDictionary()函数中读取“dictionary.txt”的代码。但是我必须实现ReadTextFile()public member函数,以便将名为:“testdata.txt”的文件读入私有成员的“KnownWords”和“UnknownWords”数据。只有“已知”的词应该放在“已知词”中,其余的词应该放在“未知词”中。 我必须使用map和pair,但我

我必须逐字阅读
“testdata.txt”
,并在另一个文件
“dictionary.txt”
中查找相同的单词。我已经实现了在
ReadDictionary()
函数中读取
“dictionary.txt”
的代码。但是我必须实现
ReadTextFile()
public member函数,以便将名为:
“testdata.txt”
的文件读入私有成员的“KnownWords”和“UnknownWords”数据。只有“已知”的词应该放在“已知词”中,其余的词应该放在“未知词”中。 我必须使用map和pair,但我不知道如何在编程中使用它。有人能帮我弄清楚这一点以便得到这个输出吗:

89 known words read.
49 unknown words read.
int main():

头文件:

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];
};
使用名称空间std;
typedef-map-WordMap;
typedef WordMap::迭代器WordMapIter;
类WordStats
{
公众:
WordStats();
void ReadDictionary();
void DisplayDictionary();
void ReadTxtFile();
私人:
单词地图;
单词映射未知词;
设置字典;
字符文件名[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
    }
    }
WordStats::WordStats(){
strcpy(文件名,“testdata.txt”);
}
//将dictionary.txt读入字典
void WordStats::ReadDictionary(){
字符串字;
ifstream-infle(“dictionary.txt”);
如果(!infle)
{

cerr首先,您使用了错误的数据类型
WordMap
。在我看来,应该是
map
,因为您想计算一个单词在文本中出现的次数

其次,您应该从文件中读取单词,而不是整行文本。您可以使用以下代码执行此操作:

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

您似乎需要检查字典,看看它是否包含您阅读的每个单词,然后选择要修改的
已知词
未知词

void WordStats::ReadTxtFile(){
    std::ifstream ifile(Filename);
    if(!ifile)
    {
        std::cerr << "Error Opening file " << Filename << std::endl;
        exit(1);
    }
把它改成小写

        transform (word.begin(), word.end(), word.begin(), ::tolower);
然后查看它是否在
字典中

        if (Dictionary.count(word))
        {
KnownWords[word]
中记录位置

            KnownWords[word].push_back(ifile.tellg());
        }
        else
        {
            UnknownWords[word].push_back(ifile.tellg()); 
        }
    }
或者在
未知词[word]

            KnownWords[word].push_back(ifile.tellg());
        }
        else
        {
            UnknownWords[word].push_back(ifile.tellg()); 
        }
    }
然后显示这些值中的
大小
s,以获得所需的输出

    std::cout << KnownWords.size() << " known words read." << std::endl;
    std::cout << UnknownWords.size() << " unknown words read." << std::endl;
}
作为一项完整的功能:

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;
}
void WordStats::ReadTxtFile(){
std::ifstream ifile(文件名);
如果(!ifile)
{

std::cerr您将什么
std::vector
值与您的已知和未知单词相关联?根据要求,我们必须使用vector将在字典中找到单词的位置推回,您使用“it”的目的是什么?它给我警告“it”不命名类型”我尝试将“段落”作为迭代器,它给了我相同的错误消息。
它是一个迭代器。如果您的编译器不支持关键字
auto
,您应该升级它或启用C++11支持。我尝试过,但现在编译器给了我这个错误:调用“std::pair::pair(std::string&,int)”没有匹配的函数“顺便说一句,我特别讨厌像
void MyClass::doAction()
这样的函数,因为它们不使用类型系统来告诉你发生了什么。问问你的讲师,为什么他们选择这些函数作为
WordStats
的成员,而不是
WordStats ReadFromStream>之类的函数(std::istream&source,std::set Dictionary)
我尝试了代码,但没有给出准确的输出。我应该在cout中的count()中写些什么?如果我像KnownWords.count(word)或UnknownWords.count(word)一样将“word”放在其中,那么这两个词的输出都是零。哦,我的意思是“size”以及如何打印出KnownWord和unownword的位置?
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;
}