如何循环使用流C++中的字符

How to loop through characters in stream C++

本文关键字:C++ 字符 何循环 循环      更新时间:2023-10-16

因此,我编写的代码从用户那里接收一个文件,删除所有标点符号。将文件设为小写,并查找所有唯一的单词。这个问题不正常,我不知道为什么。我没有打印出正确数量的唯一值

// convert charater to lowercase 
void convert(char& ch){
   ch = tolower(ch); 
 }
 int main(){
    typedef map<string,int> siMap;
    typedef pair<siMap::iterator, bool>ibPair;
    typedef siMap::value_type kvpair; 
    siMap myMap;

    string fileName1;
    string fileName2; 
    string value; 
    char ch;
   // get user input 
   cout << "Please enter the first file Name: "; //asking for a file name 
   cin >> fileName1; 
   ifstream infile1;
   infile1.open(fileName1.c_str());
   //remove all punctuations 
    while (infile1.get(ch))
    {
        if (isalpha(ch) || isspace(ch)){
              convert(ch);
        } 
        else{
            infile1.ignore(ch);  
       }
        infile1 >> value;
        myMap[value]++; 
    }
 /*
for (int i = 0; i < 10; i++) {
        cout << infile1[i];
} */
cout << " Map size is :" << myMap.size() << endl;
cout << "Please enter the second file Name: "; //asking for a file name 
cin >> fileName2; 
ifstream infile;
infile.open(fileName2.c_str());

}

您能提供第一个输入文件吗?还记得在完成文件后关闭它。对于调试部分,您可能需要使用映射迭代器来找出缺少的单词。

// convert charater to lowercase 
void convert(char& ch)
{
    ch = tolower(ch);
}
int main()
{
    typedef map<string,int> siMap;
    typedef pair<siMap::iterator, bool>ibPair;
    typedef siMap::value_type kvpair; 
    siMap myMap;
    string fileName1;
    string fileName2; 
    string value; 
    char ch;
    // get user input 
    cout << "Please enter the first file Name: "; //asking for a file name 
    cin >> fileName1; 
    std::ifstream ifs(fileName1.c_str());
    std::string content( (std::istreambuf_iterator<char>(ifs) ),
                        (std::istreambuf_iterator<char>()   ) );
    //remove all punctuations
    for(std::string::iterator it = content.begin(); it != content.end(); ++it)
    {
        if (isalpha(*it))
        {
            convert(*it);
        } 
        else
        {
            *it = ' ';  
        }
    }
    //now working on your map
    std::stringstream ss;
    ss.str (content);
    string singleWord;
    while (ss >> singleWord)
    {
        myMap[singleWord]++; 
    }
    cout << " Map size is :" << myMap.size() << endl;
    cout << "blahblah" << endl;
    for (std::map<string,int>::iterator it=myMap.begin(); it!=myMap.end(); ++it)
        std::cout << it->first << " => " << it->second << 'n';
    cout << "Please enter the second file Name: "; //asking for a file name 
    cin >> fileName2; 
    ifstream infile;
    infile.open(fileName2.c_str());
}