C++ 从字符串C+中读取单词+;而忽略空白、数字和符号。

C++ 从字符串C+中读取单词+;而忽略空白、数字和符号。,c++,string,C++,String,我正在尝试编写一个程序,读取一个文本文件,计算每个唯一单词的数量,然后对唯一单词列表进行排序,并列出每个单词出现的次数。然而,我似乎无法从一个字符串中读入一个单词而不弄乱并阅读字母、数字和符号。我读过其他主题,但我的逻辑在某些方面有严重缺陷,我看不到 int main() { fstream fp; string line; fp.open("syllabus.txt", ios::in); getline(fp, line); string word = findWords(

我正在尝试编写一个程序,读取一个文本文件,计算每个唯一单词的数量,然后对唯一单词列表进行排序,并列出每个单词出现的次数。然而,我似乎无法从一个字符串中读入一个单词而不弄乱并阅读字母、数字和符号。我读过其他主题,但我的逻辑在某些方面有严重缺陷,我看不到

int main()
{
 fstream fp;
 string line;

fp.open("syllabus.txt", ios::in);

getline(fp, line);

    string word = findWords(line);
    cout << word << endl;
}

string findWords(string &line)
{
int j = 0;
string word;

for(int i = 0; i < line.size(); i++)
{
    while(isalpha((unsigned char)line[j]) != 0 && isdigit((unsigned char)line[j]) != 1)
        j++;
    word += line.substr(0, j) + " + ";
    line  = line.substr(j, (line.size() - j));
}
return word;
}
intmain()
{
fstream-fp;
弦线;
fp.open(“提纲.txt”,ios::in);
getline(fp,line);
字符串字=查找字(行);
库特
  • 你只读了一行,但在问题部分,你说你想读整个文件

  • 为什么定义findwords来获取字符串的地址而给出字符串

  • i

  • 你的代码块有很多问题。其中一个问题是,你不想在迭代时更改行。一般来说,你不应该更改迭代的内容。你需要一个开始索引和结束索引(从搜索中找到)

    这里有一个技巧,你可以用>>操作符阅读一个单词

    ifstream fp( "syllabus.txt" );
    string word; 
    vector<string> words;  
    
    while (fp>> word)
        words.push_back(word);
    
    ifstream fp(“提纲.txt”);
    字符串字;
    向量词;
    while(fp>>word)
    单词。推回(单词);
    
    这个循环看起来很奇怪:

    for(int i = 0; i < line.size(); i++)
    {
        while(isalpha((unsigned char)line[j]) != 0 && isdigit((unsigned char)line[j]) != 1)
            j++;
        word += line.substr(0, j) + " + ";
        line  = line.substr(j, (line.size() - j));
    }
    
    for(int i=0;i
    您的“行”在循环中被修改,但发生这种情况时,您的“i”不会重置为新字符串的开头。“i”在循环中是不相关的,它不会出现在任何地方

    那么为什么会出现这种循环呢

    至于解决方案,有多种方法

    • 如果要循环,最简单的方法是将行加载到字符串中,然后使用
      string::find_first_not_of
      ,其中包含所有字母字符的字符串。这可能不是最有效的,甚至不是最优雅的。这将返回一个位置,对于字符串结尾或第一个非字母字符

    • 下一个最简单的算法是一个常规的std::find算法,它使用迭代器并允许您输入自己的谓词,您可以将其基于非字母的形式。使用C++11很容易编写基于isalpha的lambda(旧的C版本或增强的C++版本,如果字符串包含字符集外的字符,则使用区域设置)。这将返回一个迭代器,即字符串的<代码>结尾(<)/代码>或第一个非字母字符的位置。


    您的输入文本是什么?您的输出文本是什么?您希望它是什么?如果输入是“aaaa1234.01字母表季节2013”,那么输出将是“aaaa+字母表+季节”基本上,只有字母、所有空白、符号和数字被删除。这就是我所想的。1。如果我能得到一行功能,我会逐行读取文件。这只是分配的一些奇怪参数。C++实际上允许我通过检查字符串索引来读取,这在任何一个可能都不可能用的字符串中是有用的。你是对的,我试图用I作为substr()的起点,用j作为长度,但显然我不是。