Как вы ищете документ для строки в C ++? - PullRequest
3 голосов
/ 06 апреля 2010

Вот мой код:

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main()
{
    int count = 0;
    string fileName;
    string keyWord;
    string word;


    cout << "Please make sure the document is in the same file as the program, thank you!" 
         << endl << "Please input document name: " ;
    getline(cin, fileName);
    cout << endl;

    cout << "Please input the word you'd like to search for: " << endl;
    cin >> keyWord;
    cout << endl;
    ifstream infile(fileName.c_str());
    while(infile.is_open())
    {
        getline(cin,word);
        if(word == keyWord)
        {
            cout << word << endl;
            count++;
        }
        if(infile.eof())
        {
            infile.close();
        }

    }
    cout << count;

}

Я не уверен, как перейти к следующему слову, в настоящее время это бесконечные циклы ... какие-либо рекомендации?

Кроме того ... как мне сказать распечатать строку, в которой было это слово?

Заранее спасибо!

Ответы [ 4 ]

7 голосов
/ 06 апреля 2010
while(infile >> word)
{
    if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }
}

Это сделало бы работу. Пожалуйста, прочитайте о потоках больше.

2 голосов
/ 07 апреля 2010

Если все, что вы хотите сделать, это подсчитать количество ключевых слов в файле, то:

int count = std::count(std::istream_iterator<std::string>(infile),
                       std::istream_iterator<std::string>(),
                       keyword);

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

std::string      line;
std::ifstream    infile("plop");
int              lineNumber = 0;

while(std::getline(infile, line)) 
{
    ++lineNumber ;
    std::stringstream   linestream(line);
    int hits = std::count(std::istream_iterator<std::string>(linestream),
                          std::istream_iterator<std::string>(),
                          keyword);
    if (hits != 0)
    {
        std::cout << "Line: " << lineNumber << "   Matches(" << hits << ")\n";
    } 
    count  += hits;
} 
0 голосов
/ 06 апреля 2010

Проблема возникает в этой части исходного кода:

getline(cin,word);

if(word == keyWord)
{
    cout << word << endl;
    count++;
}

Прежде всего, вы не хотите читать строки из cin . Вы хотите прочитать слова из infile . Поэтому вы должны заменить первую строку вашего кода внутри цикла на:

infile >> word;
if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }

Кроме того, вы должны изменить условие цикла. Вам не нужно проверять, открыт ли здесь infile . Вы должны проверить это до цикла начинается. Для цикла необходимо проверить, достигнуто ли состояние eof или нет:

if ( !infile.is_open() ) {
    cerr << "Error while opening file." << endl;
    exit( EXIT_FAILURE );
}    

while( !infile.eof() ) {
    infile >> word;
    if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }
}

И, как вы видите, теперь вы можете избавиться от этой странной секунды , если вы поместите внутрь цикла.
Последний шаг - ввести технику «чтение впереди»: нет смысла проверять eof, когда мы ничего не читали.

if ( !infile.is_open() ) {
    cerr << "Error while opening file." << endl;
    exit( EXIT_FAILURE );
}    

infile >> word;    
while( !infile.eof() ) {
    if( word == keyWord )
    {
        cout << word << endl;
        count++;
    }

    infile >> word;
}

Надеюсь, это поможет.

0 голосов
/ 06 апреля 2010

Измените while(infile.is_open()) на while(infile). Затем вы можете удалить лишний тест eof в конце.

Он все еще открыт, даже если вы столкнулись с ошибкой или достигли конца файла. Вероятно, вы находитесь в сценарии, в котором устанавливается failbit (getline ничего не возвращает), но eof не встречался, поэтому файл никогда не закрывается, поэтому ваш цикл никогда не завершается. Использование operator bool потока обходит все эти проблемы для вас.

...