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

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

в файлы в С++?

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

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

26 ответов

7 просмотров
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);```

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта