到目前为止,这是我的代码:
#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;
}
我不确定如何进入下一个词,目前这个无限循环...任何推荐?
另外......如何告诉它打印出该单词所在的行?
提前致谢!
答案 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;
}
希望这有帮助。