如何使用'string :: find'在文件中使用C ++查找单词

时间:2013-08-06 21:21:56

标签: c++ string design-patterns findstr string-search

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

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

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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)。

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

编写一个程序可以很简单地显示'needle'所在的行,或者显示始终显示前一行,或者始终显示下一行。但你要求的是根据搜索的内容显示一个或另一个。

我们可以通过一种简单的方法来确定针是在偶数行还是在奇数行上并且基于我们在其上显示的内容。

首先我们得到行号。

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

答案 2 :(得分:-1)

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

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