170 похожих чатов

А кто-то может подсказать, как дублировать потоки stdin, stdout, stderr

в файлы в С++?

Иными словами сохранить все стримы, чтобы любой вывод stdout, stderr дублировался в файл и в консоль.
Для stdin, то просто сохранить в файл.

https://cboard.cprogramming.com/c-programming/100044-how-copy-stdout.html
Читал этот тред, но тут люди бред советовали, который явно не работает так, как хотел бы автор.

26 ответов

19 просмотров
Gleb-Pylypets Автор вопроса

нужен аналог io.MultiWriter, io.TeeReader с Golang

Обычно это делается системными вызовами или просто перенаправлением потока в оболочке командной строки (терминале)

Max 🐍 Zayceff
Обычно это делается системными вызовами или просто...

Ещё можно сделать все функции вывода в консоль такими, чтобы они ещё в фйл писали. То есть условно делается функция DEBUG_MESSAGE, которая пишет как надо

Gleb-Pylypets Автор вопроса
Max 🐍 Zayceff
Ещё можно сделать все функции вывода в консоль так...

это не будет работать, если используются сторонние либы, которые пишут через printf в stderr

Gleb-Pylypets Автор вопроса
Max 🐍 Zayceff
Обычно это делается системными вызовами или просто...

Системные вызовы мне подходят. Но как это сделать на POSIX, хм

Проще всего системными вызовами man 2 dup

Max 🐍 Zayceff
Проще всего системными вызовами man 2 dup

Это если нужно именно программно делать

Gleb-Pylypets Автор вопроса
Max 🐍 Zayceff
Проще всего системными вызовами man 2 dup

а можно конкретнее? Я читал про эти системные вызовы - не вижу, как их применить правильно.

Gleb Pylypets
а можно конкретнее? Я читал про эти системные вызо...

В интернете про системные вызовы по posix крайне много инфы

Gleb Pylypets
это не будет работать, если используются сторонние...

Если либа пишет в стдр или стдерр, и нет возможности конфигурировать, то я бы отказался от такой либы по возможности

The boost::iostreams::tee_device is made for this #include <boost/iostreams/stream.hpp> #include <boost/iostreams/tee.hpp> #include <fstream> #include <iostream> int main() { typedef boost::iostreams::tee_device<std::ostream, std::ofstream> Tee; typedef boost::iostreams::stream<Tee> TeeStream; std::ofstream file( "foo.out" ); Tee tee( std::cout, file ); TeeStream both( tee ); both << "this goes to both std::cout and foo.out" << std::endl; return 0; }

Gleb-Pylypets Автор вопроса
The Pressbraker
The boost::iostreams::tee_device is made for this ...

Да, я видел этот код в интернете, но большой проект и буст туда тянуть для такого чиха не планирую. Нужно скорее хак через posix

Gleb-Pylypets Автор вопроса
Max 🐍 Zayceff
В интернете про системные вызовы по posix крайне м...

Ну а как их применить? Ну дублирует он файловый дескриптор, а дальше что? Я могу понять, как перенаправить с помощью этого, а чтобы дублировать без двойного прохода по потоку вывода, то хз.

Gleb Pylypets
Да, я видел этот код в интернете, но большой проек...

https://9to5answer.com/custom-c-cout-class-output-to-both-console-and-log-file смотри Solution 3

Gleb Pylypets
Ну а как их применить? Ну дублирует он файловый де...

Это надо матчасть объяснять, там несложно, но долго

Gleb-Pylypets Автор вопроса
The Pressbraker
https://9to5answer.com/custom-c-cout-class-output-...

оно не сработает для printf и требует больших изменений кода. Нужно на начале выполнения какой-то хак, чтобы перенаправить.

Gleb-Pylypets Автор вопроса
Gleb Pylypets
оно не сработает для printf и требует больших изме...

https://stackoverflow.com/questions/1720535/practical-examples-use-dup-or-dup2 🙂 - всё про redirection

Gleb Pylypets
https://stackoverflow.com/questions/1720535/practi...

Посмотри эту мощную библиотеку, там есть в том числе такая штука как fork, std::cin >>= pipes::read_in_stream<std::string>{} >>= pipes::transform(toUpper) >>= pipes::to_out_stream(std::cout); https://github.com/joboccara/pipes

S.E.
В чем измеряется мощность библиотек?

в ваттах, производимых теплом жопы пользователя

Pipe открывать на каждый поток и перенаправлять в файл и дублировать на консоль, но это делается только средствами ОС, и в отдельном процессе.

Gleb Pylypets
Да, я видел этот код в интернете, но большой проек...

Буст не большой, не нравится - пиши то же самое руками, если руки не кривые

Ilya Zviagin
В ваттах

Потребляемых при компиляции кода?

freopen не подойдёт?

юзал такое ```FILE *f = freopen("output.txt", "a+", stdout); setvbuf(f, (char *)NULL, _IONBF, 0);```

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта