用C ++计算文件中单词的出现次数

时间:2015-07-06 00:46:46

标签: c++

这是我的代码,用于计算文件中特定字符串的出现次数。

#include <iostream>
#include <string>    

int frequency(std::string s, std::string file_name){

    std::ifstream file;
    std::string word;
    int count = 0;

    try{
        file.open(file_name);

        while(file>>word){
           if(s.compare(word) == 0) ++count;
        }

        file.close();
    }catch(std::ifstream::failure e){
        //std::cout<<e<<std::endl;
    }
    return count;
}

//===============================================
int main() {

    std::string file_name, word;

    std::cout << "Enter file name.." << '\n';
    std::cout << "Enter word.. " << '\n';

    std::cin >> file_name >> word; 

    int count = frequency(word, file_name);

    std::cout << "Occurrences of " << word << ": " << count;

    return 0;
}

该文件在项目的根目录中提供。问题是,我对任何被计算的单词都会0

2 个答案:

答案 0 :(得分:2)

我从file.open(file_name);更改为file.open(file_name.c_str());它运作良好。

 $ cat file.txt
 hello
 good bye

 $ a.out
Enter file name..
Enter word..
file.txt
hello
Occurances of hello: 1

ifstream将c字符串作为输入,而不是字符串。要确保文件在打开之前打开,请执行以下操作:

if (file.is_open()){
   ... do stuff....
else
   ... error 

答案 1 :(得分:0)

通过一些小的修正,您的代码将完成这项工作,特别是文件读取循环可以修改为首先读取整行,然后分别读取其中包含的每个string

int frequency(std::string s, std::string file_name) {

    std::ifstream file(file_name.c_str());
    // check if file successfully open
    if (!file) cerr << "Can't open input file!\n";

    int count = 0;
    try{

        // extract all lines
        std::string line;
        while(getline(file, line)) {

            stringstream ss(line);
            string word;

            // extract all words separated by white space
            while (ss >> word) {

                // compare with wanted
                if(s == word) ++count;
           }
        }

    }catch(std::exception& e){

        // std::cout << e.what() << std::endl;

    }
    return count;
}

很少注意到:

  • 您不需要显式关闭文件流,最后会自动完成,因为file是函数中的局部变量。

  • 如果您仅使用它来检查流状态,则try - catch块是多余的。如答案中所指出的,你可以用一行来完成它。

  • 最好将文件名设为 c - 样式字符串(以&#39; \ 0&#39;结尾)。流成员函数c_str()执行转换。

  • 您可以在流的定义中打开该文件,并跳过包含流成员函数open()的行。