2010-11-19 107 views
1

我寫了一個命令行程序,該程序將清理並重新整理我們歸檔的服務器日誌,通過逐行管道將新的目標文件。每個目標文件都有一個相應的regEx過濾器項目,因此如果源文件中紅色的行被寫入到特定目標文件(如果它與regEx匹配)。C++ ofstream - 只有1個字符串被寫入文件,之前的字符串被覆蓋,爲什麼?

我從配置文件中讀取了regEx字符串及其目標文件字符串,並將這些信息保存到向量中,以便能夠通過配置中每個新的taget /過濾器對來動態調整它們的大小。

以下一段代碼顯示了我如何循環遍歷所有源文件,並逐行讀取每一行文件,以及可能爲紅色的每一行,我遍歷配置中定義的所有過濾器,如果regEx與我寫這行的行相匹配。每當我這樣做時,在我打開新的目標文件之前,thestream會接近()d並清除()。

現在我的問題是,除了我的目標文件在程序結束後只包含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); 
} 

回答

5

嘗試 「追加」 開放模式,爲您的文件,我想它會是ios_base :: app(請參閱reopen函數,第三個參數)。

std::ios_base::out | std::ios_base::app 
+0

非常感謝!現在它工作得很好! – 2010-11-19 15:48:03

0

您需要通過添加的std :: ofstream的應用::在此方法打開追加模式

input.open(StringDirector::v_sources_list[k].c_str()); 

默認情況下應成爲

input.open(StringDirector::v_sources_list[k].c_str(), std::ofstream::app); 

模式是標準:: ofstream :: out從頭開始並覆蓋其他所有內容。

Source