我正在编写一个代码来检查一个文档(text1.txt)是否包含禁止词(bannedwords.txt)的列表。
例如,text1文档包含歌曲的歌词,我想检查禁止文档中的单词pig是否包含在其中。然后我希望输出类似于:
"pig" found 0 times
"ant" found 3 times
这是我到目前为止所提出的,但似乎无法将一系列禁止的单词放入搜索中。任何帮助都会很棒:D
感谢Fitz
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool CheckWord(char* filename, char* search)
{
int offset;
string line;
ifstream Myfile;
Myfile.open(filename);
if (Myfile.is_open())
{
while (!Myfile.eof())
{
getline(Myfile, line);
if ((offset = line.find(search, 0)) != string::npos)
{
cout << "The Word " << search<< " was found" << endl;
return true;
}
else
{
cout << "Not found";
}
}
Myfile.close();
}
else
cout << "Unable to open this file." << endl;
return false;
}
int main()
{
ifstream file("banned.txt");
if (file.is_open())//file is opened
{
string bannedWords[8];//array is created
for (int i = 0; i < 8; ++i)
{
file >> bannedWords[i];
}
}
else //file could not be opened
{
cout << "File could not be opened." << endl;
}
ifstream text1;//file is opened
text1.open("text1.txt");
if (!text1)//if file could not be opened
{
cout << "Unable to open file" << endl;
}
CheckWord("text1.txt", "cat");
system("pause");
}
答案 0 :(得分:0)
您的main()
函数正在将banned.txt
的内容读入名为std::string
的8 bannedWords
数组中。
在此之后的任何地方都没有使用数组bannedWords
。 C ++不是通过魔法工作,编译器不是通灵的,所以无法理解你的想法,以便了解你希望你的代码做什么。如果不在任何地方访问数组(或其元素),则不会使用它们来执行您想要的操作。
您需要将bannedWords
数组中的字符串传递给CheckWord()
。例如;
CheckWord("text1.txt", bannedWords[0].c_str());
会尝试将bannedWords
中第一个字符串的内容传递给CheckWord()
。
但是,除非您将CheckWord()
(名为search
)的第二个参数设为const
,否则不会编译。
或者,更好的是,将第二个参数的类型更改为std::string
类型。如果您这样做,可以消除上面c_str()
的用法。
我不能声称这是您问题的完整解决方案 - 因为您的代码中存在许多问题,其中一些问题与您提出的问题相关,而另一些则与您的问题无关。但是,我的建议将帮助您入门。
答案 1 :(得分:0)
你的问题真的很模糊;看起来你需要花一些时间来确定你的程序结构,然后才能在这里寻求帮助 但是,由于我们都是新的一次,所以建议采用合适的结构: (我忽略了文件处理位,因为它们与基本结构无关)
//Populate your array of banned words
std::string bannedWords[8];
int i;
for (int i = 0; i < 8; ++i)
{
file >> bannedWords[i];
}
//Load the entire file content into memory
std::ifstream in("text1.txt");
std::string fileContents((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
所以现在整个文件内容都在字符串&#34; fileContents&#34;中,8个被禁止的单词在&#34; bannedWords&#34;中。我建议这种方法,因为否则你会为每个单词打开,阅读和关闭文件。几乎没有一个好的设计。
现在您必须根据文件内容检查每个单词。有一些更复杂的方法可以做到这一点,但最简单的选择是循环。
//Loop through each banned word, and check if it's in the file
for (int i = 0; i < 8; i++)
{
if (fileContents.find(bannedwords[i]) != std::string::npos)
{
//Do whatever
}
}
显然,如果你想计算出现次数,你需要做一些不同的发现,但这是另一个问题。