У меня есть программа на C ++, которая печатает на экран, используя std :: cout.
Иногда мне нужно запустить его как сервис. Есть ли способ увидеть выходные данные cout, когда он работает как служба Windows?
Перенаправление вывода в файл или какую-либо программу отладки было бы идеальным вариантом.
Очевидно, я мог бы заменить cout функцией, которая пишет в файл, и это, вероятно, то, что я сделаю, но мне любопытно узнать, есть ли другие решения.
Там в основном бесконечные варианты. Первые несколько, которые приходят на ум:
Обойти ссылку ostream
Вы можете передать ссылку std :: ostream:
void someFunc(std::ostream& out) {
//someFunc doesn't need to know whether out is a file, cout, or whatever
out << "hello world" << std::endl;
}
замещать cout
основной буфер с файлом
Пример из cplusplus.com:
streambuf *psbuf, *backup;
ofstream filestr;
filestr.open ("test.txt");
backup = cout.rdbuf(); // back up cout's streambuf
psbuf = filestr.rdbuf(); // get file's streambuf
cout.rdbuf(psbuf); // assign streambuf to cout
cout << "This is written to the file";
Там есть 1-вкладыш с Freopen, но у меня есть чувство ползучести (и этот кажется, усиливает это в комментариях) что это неопределенное поведение, так как stdin и cout могут быть не синхронизированы.
freopen("/path/to/file", "r", stdout);
//cout is now writing to path/to/file
Библиотека журналов
Не уверен, что у меня все в порядке, но вы можете полностью использовать библиотеку журналов. (Есть также события Windows, хотя в зависимости от того, что вы выводите, это может не иметь смысла.)
кант
Я сомневаюсь, что это возможно с помощью службы Windows, но если это так, всегда есть классическое перенаправление:
blah.exe > C:\path\file
Простое решение SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)
,