1

新しいターゲットファイルに行ごとにパイプすることで、アーカイブされたサーバーログをクリーンアップして再編成するコマンドラインプログラムを作成しました。各ターゲットファイルには、それに応じたregExフィルター項目があるため、ソースファイルからの赤い行がこの特定のターゲットファイルに書き込まれる場合、それがregExと一致します。

構成ファイルから正規表現文字列とそのターゲットファイル文字列を読み取り、これらの情報をベクトルに保存して、構成から赤くなった新しいタゲット/フィルターのペアごとに1つずつ動的にサイズを変更できるようにします。

次のコードは、すべてのソースファイルをループする方法を示しています。すべてのソースファイルについて、行ごとに読み取り、赤になる可能性のあるすべての行について、構成で定義されたすべてのフィルターを循環し、正規表現が行と一致するかどうかを確認します。この行をofstreamに書き込みます。これを行うたびに、ofstreamは、新しいターゲットファイルを開く前にclose()dおよびclear()されます。

私の問題は、プログラムの終了後にターゲットファイルに含まれる単一の文字列が1つしかないことを除いて、すべてが正常に機能することです。ファイルに書き込んだ最後の文字列が含まれています。

以前にファイルに書き込んだ文字列はすべて上書きされているようです。私は何か間違ったことをしていると思いますが、それが何であるかわかりません。

コードの抜粋は次のとおりです。

    void StringDirector::redirect_all() {
 ifstream input;  //Input Filestream init
 ofstream output; //Output Filestream init
 string transfer; //Transfer string init
 //regex e;

 for (unsigned k = 0; k<StringDirector::v_sources_list.size(); k++) {  //loop through all sources in v_sources_list vector

  cout << endl << "     LOOP through sources! Cycle #" << k << " / string is: " << StringDirector::v_sources_list[k] << endl;

  input.close();  //close all open input files
  input.clear();  //flush
  input.open(StringDirector::v_sources_list[k].c_str());  //open v_sources_list[k] with input Filestream
  if (!input) {
   std::cout << "\nError, File not found: " <<  StringDirector::v_sources_list[k] << "\nExiting!";  //Throw error if file cannot be opened
   exit(1);
  }
  cout << endl << "     " << StringDirector::v_sources_list[k] << " opened" << endl;
  getline(input, transfer); //get a first line from input Filestream and write to transfer string
  while (input) {  //do that as long as there is input
    for (unsigned j = 0; j<StringDirector::v_filters_list.size(); j++) {  //loop through all filters in v_filters_list vectord
     cout << endl << "     LOOP through filters! Cycle #" << j << " / string is: " << StringDirector::v_filters_list[j] << endl;
     regex e(StringDirector::v_filters_list[j]);
     if (regex_search(transfer, e)) {
      reopen(output, StringDirector::v_targets_list[j].c_str());
      output << transfer << endl;
      cout << endl << "          -- MATCH! Writing line to: " << StringDirector::v_targets_list[j] << endl ;
     }
    }
    getline(input, transfer);
    if (input )cout << endl << "+ got another line: " << transfer << endl;
    else cout << endl << "End Of File!" << endl;
  }
 }
}

編集:

使用している再開機能を忘れてしまいました

    template <typename Stream>
void reopen(Stream& pStream, const char * pFile,
            std::ios_base::openmode pMode = ios_base::out)
{
    pStream.close();
    pStream.clear();
    pStream.open(pFile, pMode);
}
4

2 に答える 2

5

ファイルの「追加」オープン モードを試してみてください。ios_base::app になると思います (reopen 関数の 3 番目の引数を参照)。

std::ios_base::out | std::ios_base::app
于 2010-11-19T15:04:36.807 に答える