使用前缀搜索文本文件

时间:2016-11-28 22:39:23

标签: c++ search text-files

我有一个文本文件,每行都有一个名称/位置。是否有一种简单的方法可以根据用户输入的前缀搜索文本文件,并打印以该前缀开头的每一行。

2 个答案:

答案 0 :(得分:1)

基本上你应该遍历文件的每一行并检查其内容。这可以通过ifstream来完成:

ifstream file("text.txt");
if (file.is_open())
{
    string line;
    while (std::getline(file, line))
    {
        // match
    }
}

匹配项目的实际方法取决于前缀的复杂性。

对于简单的情况,您可以使用字符串compare方法。例如:

if (!line.compare(0, matchSize, matchPrefix))
{
    std::cout << line << std::endl;
}

string::find并检查0的结果。

如果匹配条件更复杂,您可以尝试使用regular expressions。但是,它取决于用户期望的前缀的实际格式。

您还应该考虑区分大小写是一个问题,并使用std::transformtoupper/tolower预处理比较的字符串,或编写自己的谓词以用于std::equal。例如:

string prefix = "ab";
bool match = std::equal(prefix.begin(), prefix.end(), line.begin(), [](const char& c1, const char& c2)
{
    return tolower(c1) == tolower(c2);
});

正如您所看到的,针对此类问题有许多解决方案(还有更多)。应采用哪一个取决于具体要求和用户输入的处理案例。

答案 1 :(得分:-1)

使用Boost

的解决方案

逐行遍历您的文件。

以下是依赖std::ifstreamstd::getline的代码段:

#include <fstream> // std::ifstream
#include <string> // std::string, std::getline

int main()
{
  std::ifstream file("your_file.txt"); 
  std::string line;

  while (std::getline(file, line))
  {
    // Line by line processing logic.
  }
}

谓词函数boost::algorithm::starts_with

对于给定的行,请使用Boost谓词函数boost::algorithm::starts_with。如果返回true,则打印该行。

  

功能starts_with

     

当测试字符串是Input的前缀时,此谓词成立。在   换句话说,如果输入以测试开始。什么时候可选   谓词被指定,它用于字符比较。

突出显示此功能的示例代码:

#include <boost/algorithm/string/predicate.hpp> // boost::algorithm::starts_with
#include <iostream> // std::cout
#include <string> // std::string

int main()
{
  const std::string prefix("foo");

  for (const auto &line : {"foobar", "abcdef"})
  {
    if (boost::algorithm::starts_with(line, prefix))
    {
      std::cout << line << '\n';
    }
  }
}