0

我正在创建一个程序,它将打开一个文件并在文本中搜索所需的单词。我创建了以下词库...

Lawyer    
Smith Janes
Doctor    
Michael Zane
Teacher   
Maria Omaha



#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <sstream>   
using namespace std;   

int main ()    
{    
    // Declarations    
    string reply;    
    string inputFileName;    
    ifstream inputFile;    
    char character;

    cout << "Input file name: ";    
    getline(cin, inputFileName);

    // Open the input file.    
    inputFile.open(inputFileName.c_str());      

   // Check the file opened successfully.    
    if ( ! inputFile.is_open())
    {   
                  cout << "Unable to open input file." << endl;    
                  cout << "Press enter to continue...";    
                  getline(cin, reply);           
                  return 1;
    }

现在我将整个文件保存到一个字符串中,我如何在该字符串中搜索我正在寻找的特定单词......

我正在从这个网站http://www.cprogramming.com/tutorial/lesson10.html学习 C++

我想你用过 string::find ,但我找不到太多关于如何在这个网站旁边搜索的参考资料。

http://www.cplusplus.com/reference/string/string/find/

此部分将显示整个文件。

    string original;
    getline(inputFile, original, '\0');
    cout << original << endl;    
    cout << "\nEnd of file reached\n" << endl;

    // Close the input file stream   
    inputFile.close();    
    cout << "Press enter to continue...";    
    return 0;      
}

这就是我认为程序应该采取的行动......

Please enter a word: Smith Janes
Smith Janes Lawyer

 another example.... 

Please enter a word: Doctor 
Michael Zane Doctor
4

3 回答 3

1

find返回找到单词的字符串中的位置(基于零的偏移量)。如果找不到该单词,则返回npos

#include <string>
#include <iostream>

int main()
{
    std::string haystack("some string with words in it");

    std::string::size_type pos = haystack.find("words");
    if(pos != std::string::npos)
    {
        std::cout << "found \"words\" at position " << pos << std::endl;
    }
    else
    {
        std::cout << "\"words\" not found" << std::endl;
    }
}
于 2013-08-06T23:09:16.300 回答
1
#include <string>
#include <iostream>
#include <cstdlib>

int main() {
  std::string haystack = "Lawyer\nSmith Janes\nDoctor\nMichael Zane\nTeacher\nMaria Omaha\n";

  std::string needle = "Janes";

  auto res = haystack.find(needle);
  if (std::string::npos == res) {
    std::cout << "Not found\n";
    std::exit(EXIT_FAILURE);
  }
  std::cout << res << '\n';
}

res是“Janes”所在处的字符串索引(应该是 13)。

您似乎要求的功能比仅在字符串中查找某些内容更复杂。您显示的输出具有用户输入的名称或职业,输出是相关的职业或名称。

编写一个显示“针”所在行的程序很简单,或者总是显示上一行,或者总是显示下一行。但是您要求的是根据搜索的内容显示其中一个或另一个。

我们可以实现这一点的一种简单方法是查找针是在偶数线上还是奇数线上,并以此为基础显示。

首先我们得到行号。

auto line_num = std::count(std::begin(haystack), std::begin(haystack) + res, '\n');

根据您展示的内容,职业在偶数行,名字在奇数行。我们可以很容易地得到我们想要的行号:

auto profession_line_num = line_num/2*2;
auto name_line_num = line_num/2*2 + 1;

接下来,我们可以将文本分成几行,因为我们需要处理整行并按索引获取行。我在下面展示的方法会复制文本并且效率低下,但很容易。

这是一个拆分功能:

std::vector<std::string> split(std::string const &s, std::string const &delims) {
    std::vector<std::string> res;

    std::string::size_type i = 0;
    auto found = s.find_first_of(delims, i);
    while (std::string::npos != found) {
        res.emplace_back(s, i, found-i);
        i = found+1;
        found = s.find_first_of(delims, i);
    }
    res.emplace_back(s, i);

    return res;
}

我们像这样使用 split 函数:

auto lines = split(haystack, '\n');

现在,我们可以显示我们想要的线条。

std::cout << lines[name_line_num] << ' ' << lines[profession_line_num] << '\n';

一旦你把程序放在一起打印:

Smith Janes Lawyer
于 2013-08-06T23:20:41.263 回答
-1

我认为这有你需要的所有信息。

http://www.cplusplus.com/reference/string/string/find/

于 2013-08-06T21:50:16.320 回答