J'ai écrit un programme en ligne de commande qui doit nettoyer et réorganiser nos journaux de serveurs archivés en redirigeant ligne par ligne vers de nouveaux fichiers cibles. Chaque fichier cible a un élément de filtre regEx correspondant, donc si la ligne rouge du fichier source est écrite dans ce fichier cible spécifique si elle correspond à la regEx. J'ai lu les chaînes regEx et leurs chaînes de fichiers cibles à partir d'un fichier de configuration et enregistré ces informations dans des vecteurs pour pouvoir les redimensionner dynamiquement d'une unité avec chaque nouvelle paire taget/filtre rouge de la config. Le code suivant montre comment je parcours tous mes fichiers source et pour chacun d'entre eux je lis ligne par ligne et pour chaque ligne qui pourrait être rouge je passe en revue tous les filtres définis dans la config et si le regEx correspond à la ligne que j'écris cette ligne à ofstream. Chaque fois que je fais cela, l'ofstream obtient close() d et clear() ed avant d'ouvrir le nouveau fichier cible.C++ ofstream - 1 seule chaîne est écrite dans le fichier, la chaîne précédente est écrasée, pourquoi?
Mon problème est maintenant que tout fonctionne bien, sauf de mes fichiers cibles ne contiennent qu'une seule chaîne après la fin du programme. Il contient la dernière chaîne que j'ai écrite dans le fichier. Toutes les chaînes que j'ai écrites dans le fichier avant semblent être remplacées. Je pense que je fais quelque chose de mal mais je ne vois pas ce que c'est.
est ici l'extrait de code:
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;
}
}
}
EDIT:
j'ai oublié la réouverture de la fonction que j'utilise
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);
}
Merci beaucoup! Maintenant, ça fonctionne très bien! –