2009-03-26 8 views
0

У меня есть следующий шаблон функции, которая печатает COUT:Howto Pass ссылка на файл функцию для вывода потокового

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; 
     } 
    */ 

Как я могу изменить его так, что он также принимает дескриптор файла в качестве входных данных и печати в том, что файл, как указано в дескрипторе файла?

Так что мы можем сделать что-то вроде:

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

ответ

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: большое спасибо. Но почему вы используете «ostream & o» вместо «ofstream & o»? Кроме того, в основном я использую «ofstream myfile». – neversaint

+0

ofstream - это специализация ostream: все потоки являются потоками, но обратное неверно. Это полезно, когда вы хотите распечатать поток строк или собственный сериализатор. – dirkgently

1

Пропустите ofstream по ссылке:

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

Кроме того, удалить значение по умолчанию для сентября или изменить порядок аргументов , так как вы не можете иметь аргумент по умолчанию в середине списка аргументов с последующими значениями, отличными от значений по умолчанию.

EDIT: Как было предложено в комментариях и реализовано в ответе dirkgently, вы, скорее всего, захотите использовать ostream вместо потока, чтобы быть более общим.

+0

Ваш код имеет 'ofstream', а не' ostream'. Опечатка? – dirkgently

+0

Нет, просто вырезаем пасту из оригинала, добавив амперсанд. – camh

+0

@camh: ok, я перейду на «ostream &», но нормально ли поддерживать «outstream myfile» в главной функции? – neversaint

 Смежные вопросы

  • Нет связанных вопросов^_^