我试图创建一个可搜索的数据库,它从用户接收5个成分作为字符串向量,然后将其与文本文件中的食谱进行比较。将文本文件转换为字符串,然后将其分解为字符串向量。当我尝试通过标记搜索成分时,它会输出每个食谱,即使搜索的项目不在食谱中。
我检查过,tokenize功能完美无缺
我还想确保循环检查每个食谱中的成分(不只是在看到它的时候停止)有关如何做的任何提示吗?
我对C ++很陌生,所以我感谢任何帮助。
void recipesearch(const vector<string>& ingredientlist) //ifstream& recipes)
{
ifstream myrecipes;
string ingredient;
string file;
vector <string> tokens;
myrecipes.open("recipes.txt");
if (myrecipes.is_open())
{
// read entire file into string
myrecipes.seekg(0, std::ios::end);
file.reserve(myrecipes.tellg());
myrecipes.seekg(0, std::ios::beg);
file.assign((std::istreambuf_iterator<char>(myrecipes)),
std::istreambuf_iterator<char>());
transform(file.begin(), file.end(), file.begin(), ::tolower);//makes database lowercase
Tokenize(file, tokens, "#");//places recipes as seperate strings into vector
for (const string & ingredient : ingredientlist) // each ingredient in ingredient vector
{
for (const string & recipe : tokens){ //each recipe in recipe vector
if (recipe.find(ingredient) != recipe.npos) // found ingredient in file
{
cout << "yo";
}
}
}
}
else cout << "Unable to open recipe file!";
myrecipes.close();
}
答案 0 :(得分:0)
鉴于问题陈述,设计不足。但是,你提到了C ++的新手。如果这只是为了学术目的,我会推迟这类问题,并建立起来。
您需要做的是学习将类序列化为文件并返回。如果您要对食谱及其成分进行实际的类表示,以及读取和写入文件的方法,那么这个问题的设计就会简单得多。
然后,只需通过谓词搜索配方对象集合到搜索功能即可。
我会从这里开始: http://www.parashift.com/c++-faq/serialization.html
答案 1 :(得分:0)
翻转两个for循环,以便在食谱中搜索成分。当您找到一种成分时,将其标记为找到并寻找下一种成分。只有当找到所有成分时,你才会“哟”这个食谱。
这是一种简单而愚蠢的方法:
class Recipe
{
public:
bool requiresIngredients(const vector<string> & ingredients);
}
Christopher Pisz在他们的回答中暗示了一种更好的方法:创造一个更聪明的食谱。而不是字符串,创建一个包含字符串的类。给这个类一个搜索成分的方法。
for (const Recipe & recipe : recipes){ //each recipe in recipe vector
if (recipe.requiresIngredients(ingredientlist))
{
cout << "yo"
}
}
然后你可以
public void setTitle(String title) {
this.title = title;
}
没有人关心Recipe如何搜索或存储其数据。当你提出更好的方法来存储和搜索其他代码时,配方永远不需要改变。