2017-10-06 19 views
0

ファイルを開いて、行内のキーワードを検索しています。 そのキーワードが見つかった場合、私はファイルから同じ行のキーワードを見つけだすまで、ファイルから行を読みとっています。ほとんどの場合、うまくいきます。しかし、正しく動作していません。この行getlineはファイルを開くことで動作しません

::MessageBox(NULL, TEXT("here -2"), TEXT(""), MB_OK); 

は、私がチェックしたときに決して実行されません。私はfind関数で関数が成功することはないと考えています。私はgetl​​ine()関数を疑っています。私が探しているテキストはファイル内にあり、空白の文字列です[AB CD EFのように]。これは行の最初のパターンとして存在し、このテキストの前に空白がありません。 C++の新機能です。ここに私のコードです。

std::ifstream in(curr_file_path); 
std::string search("SEARCH"); 
std::string line; 

char *pDestText = new char[8000*256+1]; 
int f_match = -1; 
int l_match = -1; 
int r_val=0; 
int textLen = 0; 
int flag = 0; 
    while (std::getline(in, line)) 
    { 

     r_val = line.find(search); 
     if (r_val!=(std::string::npos)) 
     { 
      ::MessageBox(NULL, TEXT("here -2"), TEXT(""), MB_OK); 
      f_match = r_val; 

      while (std::getline(in, line)) 
      { 
       ::MessageBox(NULL, TEXT("here -3"), TEXT(""), MB_OK); 
       r_val = line.find(search); 
       if (r_val != std::string::npos) 
       { 
        l_match = r_val; 
        break; 
       } 
       else 
       { 
        ::MessageBox(NULL, TEXT("here -4"), TEXT(""), MB_OK); 
        for (int i = 0; i < line.size(); i++) 
        { 
         pDestText[textLen++] = line[i]; 
        } 
       } 
      } 
      ::MessageBox(NULL, TEXT("here -5"), TEXT(""), MB_OK); 
      for (int i = 0; i < r_val; i++) 
      { 
       //if(line[i]!='=') 
       ::MessageBox(NULL, TEXT("here -6"), TEXT(""), MB_OK); 
       pDestText[textLen++] = line[i]; 
      } 
      //pDestText[textLen] = '\0'; 
      ::MessageBox(NULL, TEXT("here -7"), TEXT(""), MB_OK); 
      break; 
     } 
    } 
    in.close(); 
+3

デバッガを使用してコードを読み込んでファイルを解析するときに、一度に1行ずつコードをステップ実行して、ここに示したすべての変数は、各段階で、問題のコードが検索文字列を含む行を読み込んだときにどのような観測をしましたか?座って誰かがstackoverflow.comであなたのためにそれを把握するのを待つ理由はありません。あなたが5分で自分を理解できたときです。あなたは本当にデバッガの使い方を学ぶべきです。デバッガの使い方を知ることは、すべてのC++開発者にとって必須のスキルです。これがそのためのものです。 –

+2

サムが100%正しい!デバッガを持っていない/使用していない場合は、少なくともデバッグプリントを使用してください。例えば、 'getline'が動作しないと言うと、' std :: cout << line << std :: endl 'それが何を読むのか見て後... –

答えて

0

私は人々に標準的なC++を、きれいな方法で表示したいと思っていますか?

Live On Coliru

#include <fstream> 
#include <string> 
#include <iostream> 
#include <iterator> 
#include <sstream> 

// start SEARCH block 

bool filter_lines(std::istream& haystack, std::string const& needle, std::ostream& dest) { 
    bool active = false; 
    std::string line; 

    auto trigger = [&] { 
     bool match = std::string::npos != line.find(needle); 
     if (match) 
      active = !active; 
     return match; 
    }; 

    auto act = [&] { if (active) dest << line << "\n"; }; 

    while (getline(haystack, line)) 
     if (!trigger()) 
      act(); 

    return active; 
} 

int main() { 
    std::ifstream ifs("main.cpp"); 
    std::stringstream destText; 

    if (filter_lines(ifs, "SEARCH", destText)) 
     std::cerr << "Warning: last delimited block unclosed\n"; 

    std::cout << "------------- FILTERED -----------\n" 
       << destText.rdbuf() 
       << "----------------------------------\n"; 
} 

私は、正確な問題に対処しないかもしれません実現が、私は答えのこのタイプは、多くの場合、より有益であると感じ¹。デバッガを使用して自分のミスを見つけるためには、建設的なコメントにも同じです。

関連する問題