0
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
vector<string> Letter;
float frequency1(string word)
{
   float count=0.0;
   for (int i=0;i<Letter.size();++i)
   {
      transform(word.begin(),word.end(),word.begin(),::tolower);
      transform(Letter[i].begin(),Letter[i].end(),Letter[i].begin(),::tolower);   

      if (strcmp(word.c_str(),Letter[i].c_str())==0)
      {
          count+=1;
      }   
  }
  count=(count/Letter.size())*100;
  if (count>=0.5)
  {
         return count;
  }
  else
  {
      return 0.0;
  }
}                                       

int main()
{
    ifstream fin;
    fin.open("frequent.txt");
    if (fin.fail())
    {
        cout<<"Error opening file!"<<endl;
    }

    while(!fin.eof()) 
    {
        string buffer;              
        getline(fin,buffer,' ');
        cout<<buffer<<endl;
        Letter.push_back(buffer);
    }
    cout<<endl;
    vector<string> frequent;
    vector<float> frequency;
    for (int i=0;i<Letter.size();++i)
    {
        string a=Letter[i];
        int k=0;
        for (int j=0;j<i;++j)
        {
            transform(a.begin(),a.end(),a.begin(),::tolower);
            transform(Letter[j].begin(),Letter[j].end(),Letter[j].begin(),::tolower);
            if (a==Letter[j])
            {
                 break;
            }
            k++;
        }
        int size=Letter.size();
        if (k!=size-1)
        {
            continue;
        }            
        float counter=frequency1(a);
        if(counter>0.0)
        {
            frequent.push_back(Letter[i]);
            frequency.push_back(counter);
        }
    }
    cout<<"Here are the repeated words"<<endl;
    for (int i=0;i<frequency.size();++i)
    {
        cout<<"       "<<frequent[i]<<", frequency: "<<frequency[i]<<endl;
    }
    system("PAUSE");
    return 0;
}         

我正在编写一个程序来确定文档(文本)中重复单词的频率。如果频率大于或等于 0.5,则该词作为重复词通过。但是当我运行它时,它没有显示任何重复的单词,尽管我什至手动计算并且知道文档中有重复的单词。我无法弄清楚问题所在。

4

1 回答 1

1

首先,当您无法打开输入文件时,您应该exit或将其余部分包装到 else 中main

if (fin.fail())
{
    cout<<"Error opening file!"<<endl;
}

否则,您将继续尝试从无效流中读取。

std::getline你用空格' '作为分隔符来阅读你的单词。这意味着,您的文字中包含 newlines '\n'、 tabs'\t'等,这可能不是您想要的。一种更好、更安全的阅读文字的方法是

std::string word;
while (fin >> word) {
    // process word
}

这会跳过所有空格并正确检测 EOF 作为额外的好处。

可能还会有进一步的问题。

于 2012-12-16T16:04:13.563 回答