我寫了一個命令行程序,該程序將清理並重新整理我們歸檔的服務器日誌,通過逐行管道將新的目標文件。每個目標文件都有一個相應的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);
}
非常感謝!現在它工作得很好! – 2010-11-19 15:48:03