如何在c ++中搜索文档中的字符串?

时间:2010-04-06 03:02:20

标签: c++ fstream ifstream ofstream

到目前为止,这是我的代码:

#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 个答案:

答案 0 :(得分:7)

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

这可以胜任。请阅读更多关于流的信息。

答案 1 :(得分:2)

如果您只想计算文件中关键字的数量,那么:

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

答案 2 :(得分:0)

while(infile.is_open())更改为while(infile)。然后,您可以在最后删除冗余的eof测试。

即使您遇到错误或到达文件末尾,它仍然处于打开状态。您可能正处于设置failbit的情况下(getline没有返回任何内容),但是没有遇到eof,因此文件永远不会关闭,因此您的循环永远不会退出。使用流的operator bool可以解决所有这些问题。

答案 3 :(得分:0)

问题出在源代码的这一部分:

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

希望这有帮助。