2009-03-26 5 views
0

je la fonction de modèle suivant qui imprime à cout:Howto Passe descripteur de fichier à une fonction pour la sortie en streaming

template <typename T> void prn_vec(const std::vector <T>&arg, string sep="") 
    { 
     for (unsigned n = 0; n < arg.size(); n++) { 
      cout << arg[n] << sep;  
     } 
     return; 
    } 

    // Usage: 
    //prn_vec<int>(myVec,"\t"); 

    // I tried this but it fails: 
    /* 
     template <typename T> void prn_vec_os(const std::vector <T>&arg, 
     string sep="",ofstream fn) 
     { 
     for (unsigned n = 0; n < arg.size(); n++) { 
      fn << arg[n] << sep;  
     } 
     return; 
     } 
    */ 

Comment puis-je modifier pour qu'il prenne également poignée de fichiers en entrée et imprimer que fichier comme référé par le handle de fichier?

Afin que nous puissions faire quelque chose comme:

#include <fstream> 
#include <vector> 
#include <iostream> 
int main() { 

    vector <int> MyVec; 
    MyVec.push_back(123); 
    MyVec.push_back(10); 

    ofstream myfile; 
    myfile.open ("example.txt"); 
    myfile << "Writing this to a file.\n"; 


    // prn_vec(MyVec,myfile,"\t"); 

    myfile.close(); 
    return 0; 
} 

Répondre

3
template <typename T> 
ostream& prn_vec(ostream& o, const std::vector <T>&arg, string sep="") 
{ 
    for (unsigned n = 0; n < arg.size(); n++) { 
     o << arg[n] << sep;  
    } 
    return o; 
} 

int main() { 

    vector <int> MyVec; 
    // ... 
    ofstream myfile; 

    // ... 
    prn_vec(myfile, MyVec, "\t"); 

    myfile.close(); 
    return 0; 
} 
+0

@dirkgently: merci beaucoup. Mais pourquoi utilisez-vous "ostream & o" au lieu de "ofstream & o"? En outre dans le main j'utilise "ofstream myfile". – neversaint

+0

ofstream est une spécialisation de ostream: Tous les streams sont des ostreams mais l'inverse n'est pas vrai. Cela est utile lorsque vous souhaitez imprimer sur un flux de chaînes ou un sérialiseur personnalisé. – dirkgently

1

passer le ofstream par référence:

template <typename T> void prn_vec_os(
    const std::vector <T>&arg, 
    string sep, 
    ofstream& fn) 

En outre, supprimez la valeur par défaut pour sept ou réorganiser les arguments , puisque vous ne pouvez pas avoir un argument par défaut au milieu de la liste d'arguments avec les non-défauts suivants.

EDIT: Comme suggéré dans les commentaires et mis en œuvre dans la réponse de dirkgently, vous voudrez probablement utiliser un ostream au lieu d'un ofstream, afin d'être plus général.

+0

Votre code a 'ofstream' et non' ostream'. Faute de frappe? – dirkgently

+0

Non, il suffit de couper et coller de l'original, en ajoutant une esperluette. – camh

+0

@camh: ok, je vais changer pour "ostream &", mais est-ce ok pour garder "ofstream myfile" dans la fonction principale? – neversaint

Questions connexes