2010-11-19 3 views
1

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); 
} 

Répondre

5

Essayez "ajouter" en mode ouvert pour votre dossier, je suppose que ce sera soit ios_base :: app (voir la fonction reopen, 3ème argument).

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

Merci beaucoup! Maintenant, ça fonctionne très bien! –

0

Vous devez activer le mode append dans cette méthode en ajoutant std :: ofstream :: app

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

devrait devenir

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

par défaut, le mode est std :: ofstream :: out qui commence au début et remplace tout le reste.

Source

Questions connexes