2015-03-26 6 views
0

Я пишу код, чтобы проверить, содержит ли один документ (text1.txt) список запрещенных слов (bannedwords.txt).Проверка наличия одного документа в другом C++

Например, в тексте 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"); 
} 
+1

Нам нравятся четкие вопросы. Что означает «но не может показаться, что он помещает массив запрещенных слов в поиск»? Пожалуйста, дайте ясный пример некоторых коротких входных файлов и вывода, что не так, и что вы не понимаете, почему это происходит. –

+0

Подсказки: 'push_back()' to 'std :: vector bannedWords;' вместо использования массива фиксированного размера и созданного 'bannedWords' вне конструкторов' if'/'for', иначе он оставит область и будет уничтожен, прежде чем вы захотите его использовать. Передайте его в «CheckWord» в качестве дополнительного параметра. После неустранимой ошибки вызовите 'exit (EXIT_FAILURE);' вместо того, чтобы печатать сообщение об ошибке и пытаться продолжить с плохими данными. Используйте 'while (getline (Myfile, line)' и не проверяйте 'while (... eof)'. –

+0

есть ваш вопрос: «Как я могу изменить вызов CheckWord для передачи массива строк?». – Ian

ответ

0

Ваша main() функция считывает содержимое banned.txt в массив 8 std::string имени bannedWords.

Массив bannedWords не используется нигде после этого. C++ не работает по магии, а компиляторы не являются экстрасенсами, поэтому вы не можете читать свой ум, чтобы понять, что вы хотите, чтобы ваш код делал. Если массив (или его элементы) не доступен нигде, они не будут использоваться для выполнения того, что вы хотите с ними.

Вам необходимо передать строки из массива bannedWords в CheckWord(). Например;

CheckWord("text1.txt", bannedWords[0].c_str()); 

будет пытаться передать содержимое первой строки в bannedWords к CheckWord().

Однако, это не скомпилируется, если вы не сделаете второй параметр CheckWord() (по имени search) - const.

Или, еще лучше, измените тип второго аргумента на тип std::string. Если вы это сделаете, вы можете исключить использование c_str() в приведенном выше.

Я не утверждаю, что это полное решение вашей проблемы, потому что в вашем коде есть множество проблем, некоторые из которых связаны с тем, о чем вы просили, а некоторые нет. Тем не менее, мой совет здесь поможет вам начать.

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>()); 

Так теперь все содержимое файла находится в строке «fileContents», а 8 запрещенных слов находятся в «bannedWords». Я предлагаю этот подход, потому что иначе вы открываете, читаете и закрываете файл для каждого слова. Вряд ли хороший дизайн.

Теперь вы должны проверить каждое слово на содержимое файла. Есть несколько более сложных способов сделать это, но ваш самый простой вариант - это цикл.

//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 
    }  
} 

Очевидно, что вам нужно сделать найти немного по-другому, если вы хотите, чтобы подсчитать количество вхождений, но это другой вопрос.

Смежные вопросы