в файлы в С++?
Иными словами сохранить все стримы, чтобы любой вывод stdout, stderr дублировался в файл и в консоль.
Для stdin, то просто сохранить в файл.
https://cboard.cprogramming.com/c-programming/100044-how-copy-stdout.html
Читал этот тред, но тут люди бред советовали, который явно не работает так, как хотел бы автор.
нужен аналог io.MultiWriter, io.TeeReader с Golang
Обычно это делается системными вызовами или просто перенаправлением потока в оболочке командной строки (терминале)
Ещё можно сделать все функции вывода в консоль такими, чтобы они ещё в фйл писали. То есть условно делается функция DEBUG_MESSAGE, которая пишет как надо
это не будет работать, если используются сторонние либы, которые пишут через printf в stderr
Системные вызовы мне подходят. Но как это сделать на POSIX, хм
Проще всего системными вызовами man 2 dup
Это если нужно именно программно делать
а можно конкретнее? Я читал про эти системные вызовы - не вижу, как их применить правильно.
В интернете про системные вызовы по posix крайне много инфы
Если либа пишет в стдр или стдерр, и нет возможности конфигурировать, то я бы отказался от такой либы по возможности
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; }
Да, я видел этот код в интернете, но большой проект и буст туда тянуть для такого чиха не планирую. Нужно скорее хак через posix
Ну а как их применить? Ну дублирует он файловый дескриптор, а дальше что? Я могу понять, как перенаправить с помощью этого, а чтобы дублировать без двойного прохода по потоку вывода, то хз.
https://9to5answer.com/custom-c-cout-class-output-to-both-console-and-log-file смотри Solution 3
Это надо матчасть объяснять, там несложно, но долго
оно не сработает для printf и требует больших изменений кода. Нужно на начале выполнения какой-то хак, чтобы перенаправить.
https://stackoverflow.com/questions/1720535/practical-examples-use-dup-or-dup2 🙂 - всё про redirection
Посмотри эту мощную библиотеку, там есть в том числе такая штука как fork, std::cin >>= pipes::read_in_stream<std::string>{} >>= pipes::transform(toUpper) >>= pipes::to_out_stream(std::cout); https://github.com/joboccara/pipes
В чем измеряется мощность библиотек?
в ваттах, производимых теплом жопы пользователя
Pipe открывать на каждый поток и перенаправлять в файл и дублировать на консоль, но это делается только средствами ОС, и в отдельном процессе.
Буст не большой, не нравится - пиши то же самое руками, если руки не кривые
Потребляемых при компиляции кода?
freopen не подойдёт?
юзал такое ```FILE *f = freopen("output.txt", "a+", stdout); setvbuf(f, (char *)NULL, _IONBF, 0);```
Обсуждают сегодня