4

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

#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

4 回答 4

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

这将完成这项工作。请阅读更多关于流的信息。

于 2010-04-06T03:05:19.547 回答
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;
} 
于 2010-04-07T15:54:41.183 回答
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;
}

希望这可以帮助。

于 2010-04-06T08:23:22.170 回答
-1

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

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

于 2010-04-06T03:08:13.063 回答