2015-11-30 3 views
0

Я пытаюсь создать базу данных рецептов для поиска по ингредиенту для проекта. Я новичок в C++, так голый со мной. Сейчас я пытаюсь создать цикл for, который проходит через вектор строки (который содержит каждый ингредиент, сохраненный в нем), и поиск по файлу и сравнение их. Прямо сейчас, я просто хочу, чтобы он выводил «Привет!». если они совпадают. При всей моей игре, либо 100 Hello! S (определенно не так), либо нет. Вот код. Заранее благодарю.Поиск в текстовых файлах для определенного слова C++

int main() 
{ 
int y; 
cout << "Hello! Welcome to Abby's Recipe Calculator." << endl << endl; 
cout << "Please select an option: 1 to search by ingredient or 2 to browse recipes..." << endl; 
cin >> y; 

vector <string> ingreds; 
ingreds.reserve(4); 

if (y == 1) 
{ 
    ingredientvector(ingreds); // calls function to fill vector w/ ingredients 
} 
//else if (y == 2) 
//{ 
//call recipe function... 
//} 

Search x1(ingreds); //assigns ingredients to object vector 

recipesearch(x1.getingreds()); 

system("pause"); 
return 0; 
} 

void ingredientvector(vector<string>& x) 
{ 
cout << "SEARCH BY INGREDIENT" << endl; 
cout << "Please enter up to three ingredients... " << endl; 

for (int i = 0; i < 4; i++) 
{ 
    x.push_back(" "); 
    getline(cin, x[i]); 
    if (x[i] == "1") 
    { 
     break; 
    } 

} 

    } 

    void recipesearch(const vector<string>& ingredientlist) //ifstream& recipes) 
{ 

ifstream myrecipes; 
string line; 
string ingredient; 
myrecipes.open("recipes.txt"); 
if (myrecipes.is_open()) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     ingredient = ingredientlist[i]; 
     while(getline(myrecipes, line)){ 
      if (ingredient == line) 
      { 
       cout << "Hello!" << endl; 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
} 
else cout << "Unable to open recipe file!"; 

myrecipes.close(); 
} 

Вот пример рецепта используется:

Cheese-y Ramen 

Prep Time: 5 minutes 
Cook Time: 20 minutes 
Total Time: 25 minutes 
Servings: 2 
Ingredients: 
8 oz cheddar cheese 
1 tablespoon cornstarch 
¾ cup milk 
2 packages ramen noodles 
Directions: 
1. Grate cheddar cheese and add with cornstarch into a small bowl 
2. Combine with milk in a medium saucepan and cook on medium to low heat until consistent. Keep warm until serving. 
3. In a separate pan boil ramen noodles. Set aside the included flavor packets. 
4. Once boiling, drain the noodles and combine with cheese. 
Recipe from Buzzfeed 
+1

Можете ли вы добавить пример своего файла рецепта. –

+0

После одной итерации 'i' вы находитесь в конце своего файла, и все последующие итерации сразу же будут нарушены, так как читать нечего. Попробуйте изменить ваши петли. – usr2564301

+0

А, да. Jongware верна. Это будет проблемой. –

ответ

0

Try переворачивая время и для цикла, как, например:

...the code before your for loop  
while(getline(myrecipes, line)) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     ingredient = ingredientlist[i]; 
     if (ingredient == line) 
     { 
      cout << "Hello!" << endl; 
     } 
     else 
     { 
      break; 
     } 
    } 
} 
...the code after your for loop 
+0

Стоит редактировать, чтобы объяснить, почему это поможет. – user4581301

+0

Должен ли я загрузить сам текстовый файл? это просто простой текстовый файл с рецептами, перечисленными и погруженными тире –

+0

На самом деле я ошибся в этом перерыве. Поскольку это не содержит, но точное совпадение, может быть только одно правильное совпадение за цикл итерации, поэтому удалена моя дополнительная модификация. –

1

Это читает весь файл рецепта в строку , затем просматривает строку для каждого ингредиента. Примечание. Это чрезвычайно грубая сила. Это быстро, но не очень точно. Например, если Cheetos упоминаются в боковой панели, а не в самом рецепте, они все равно будут перечислены.

Кредита, где это связанно, этот ответ поднимает файл для чтения оптом от Read whole ASCII file into C++ std::string

void recipesearch(const vector<string>& ingredientlist) 
{ 

    ifstream myrecipes; 
    string file; 
    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>()); 

     // look inside file string for each ingredient 
     for (const string & ingredient: ingredientlist) 
     { 

      if (file.find(ingredient) != file.npos) 
      { // found ingredient in file 
       cout << ingredient << endl; 
      } 
     } 
    } 
    else 
     cout << "Unable to open recipe file!"; 

} 

Предостережения: Много файлов, которые вы будете тянуть из Интернета в закодированном в многобайтовой характер набора, чтобы получить более красивые результаты и интернационализация, а не 7-битный ASCII, используемый по умолчанию большинством стандартных инструментов C++, включая те, которые используются в приведенном выше примере кода.

Правильно интерпретировать, какие из множества многобайтовых наборов символов использовать и как их потреблять, является предметом обсуждения для себя, но для целей этого назначения OP может уйти с гарантией сохранения всех входных файлов с кодировкой ASCII.

+0

Это было чрезвычайно полезно! был file.reserve (myrecipes.tellg()), который должен быть «myrecipes.reverse .....»? –

+0

невредим, просто пришлось прочитать его снова. Спасибо! –

+0

Я понимаю, что вы цитируете только заголовок «Читать весь ASCII-файл в C++ std :: string», и этот код действительно может работать, но данные вопроса не являются ASCII. (Предположительно, кодировка является «системным значением по умолчанию», поэтому, если файл сохраняется как «системный по умолчанию», а программа, которая читает, работает в системе (или пользовательских настройках) с одинаковой кодировкой по умолчанию, она может работать.) –