这是我的代码,用于计算文件中特定字符串的出现次数。
#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
。
答案 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()
的行。