使用C ++在文件中进行字符串搜索/索引

时间:2013-10-03 12:16:20

标签: c++ string search

我使用以下代码搜索文件并提供数据和相关的行号。但是这个代码在成千上万行的情况下是否足够快?我的电脑几乎冻结了几秒钟。我需要搜索整数对并在逗号之后返回其RHS值(一些统计信息),但是使用以下代码我可以返回整行。

  1. 使用split函数解析返回的数据并获得我的RHS值
  2. 在坚牢度方面是否好主意

    OR

    1. 根据LHS参数直接获取RHS值。 (好吧,我无法做到这一点)
    2. 任何人都可以帮助我实现上述任何一项吗?

      这是我的代码:

      #include <string>
      #include <iostream>
      #include <fstream>
      
          int main()
          {
              std::ifstream file( "index_hyper.txt" ) ;
              std::string search_str = "401" ;
              std::string line ;
              int line_number = 0 ;
              while( std::getline( file, line ) )
              {
                  ++line_number ;
                  if( line.find(search_str) != std::string::npos )
                      std::cout << "line " << line_number << ": " << line << '\n' ;
              }
          }
      

      以下是我index_hyper.txt档案的内容:

      18,22
      20,37
      151,61
      200,62
      156,63
      158,64
      159,65
      153,66
      156,67
      152,68
      154,69
      155,56
      156,14
      157,13
      160,122
      161,1333
      400,455
      401,779
      402,74
      406,71
      

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码完成上述代码的工作:

grep -n "^401," index_hyper.txt

如果您只想输出RHS,您可以:

grep  "^401," index_hyper.txt | sed "s/[^,]*,//"

如果您使用的是没有sed,grep,bash等的Windows平台,则可以通过安装cygwin轻松访问unix工具。

答案 1 :(得分:0)

作为一般规则,不要开始破坏字符串 小块(子串)直到你需要。然后开始 准确地说明需要什么:你说的是RHS和LHS,以及 谈谈“根据LHS论证获得RHS值”。所以:你想要吗? 第一个字段的完全匹配,一个子字符串匹配 第一个字段,或整行的子字符串匹配?

无论如何:一旦你有了line中的一行,就可以轻松完成 将它分成两个字段:

std::string::const_iterator pivot = std::find( line.cbegin(), line.cend(), ',' );

您所做的事情取决于您的标准:

if ( pivot - line.cbegin() == search_str.size() &&
        std::equal( line.cbegin(), pivot, search_str.begin() ) ) {
    //  Exact match on first field...
    std::cout << std::string( std::next( pivot ), line.cend() );
}

if ( std::search( line.cbegin(), pivot, search_str.begin(), search_str.end() ) != pivot ) {
    //  Matches substring in first field...
    std::cout << std::string( std::next( pivot ), line.cend() );
}

if ( std::search( line.cbegin(), line.cend(), search_str.begin(), search_str.end() ) != line.cend() ) {
    //  Matches substring in complete line...
    std::cout << std::string( std::next( pivot ), line.end() ); }
}

当然,您需要进行一些额外的错误检查。什么 如果行中没有逗号(例如pivot == line.end()),你应该这样做吗?或者是什么额外的空间 线。 (您的示例看起来像数字。"401"应该匹配 仅"401",或"+401"?)

在继续之前,你应该仔细说明 对于所有可能的输入,代码应该做什么。 (对于 最可能的输入,当然,答案可能是: 输出一个错误消息,其行号为std::cerr和 继续。在这种情况下一定要返回EXIT_FAILURE。)