Получите станд.:: ostream любой от станд.:: суд или станд.:: ofstream (файл)

Используйте Promise.resolve - он возьмет любой последующий, как обещание от какой-либо другой реализации, и ассимилирует его в обещание Bluebird.

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

47
задан Frank Krueger 14 December 2008 в 21:00
поделиться

2 ответа

std::streambuf * buf;
std::ofstream of;

if(!condition) {
    of.open("file.txt");
    buf = of.rdbuf();
} else {
    buf = std::cout.rdbuf();
}

std::ostream out(buf);

, Который связывает базовый streambuf или суда или потока выходного файла к. После этого можно записать в, и это закончится в правильном месте назначения. Если Вы просто хотите это, все идущее в std::cout входит в файл, можно также сделать

std::ofstream file("file.txt");
std::streambuf * old = std::cout.rdbuf(file.rdbuf());
// do here output to std::cout
std::cout.rdbuf(old); // restore

, Этот второй метод имеет недостаток, что это не безопасное исключение. Вы возможно хотите записать класс, который делает это использование RAII:

struct opiped {
    opiped(std::streambuf * buf, std::ostream & os)
    :os(os), old_buf(os.rdbuf(buf)) { }
    ~opiped() { os.rdbuf(old_buf); }

    std::ostream& os;
    std::streambuf * old_buf;
};

int main() {
    // or: std::filebuf of; 
    //     of.open("file.txt", std::ios_base::out);
    std::ofstream of("file.txt");
    {
        // or: opiped raii(&of, std::cout);
        opiped raii(of.rdbuf(), std::cout);
        std::cout << "going into file" << std::endl;
    }
    std::cout << "going on screen" << std::endl;
}

Теперь, что бы ни случилось, станд.:: суд находится в чистом состоянии.

65
ответ дан Johannes Schaub - litb 7 November 2019 в 23:15
поделиться

Это безопасно от исключения:

void process(std::ostream &os);

int main(int argc, char *argv[]) {
    std::ostream* fp = &cout;
    std::ofstream fout;
    if (argc > 1) {
        fout.open(argv[1]);
        fp = &fout;
    }
    process(*fp);
}
<час>

Редактирование: Herb Sutter обратился к этому в статье , Переключающей Потоки (Гуру Недели) .

25
ответ дан Tom 7 November 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: