Эта функция не существует в Boost.Однако вы можете использовать _dup2
для замены стандартного дескриптора out:
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <io.h>
#include <iostream>
#include <windows.h>
int main()
{
HANDLE h = CreateFile(TEXT("test.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (0 == SetStdHandle(STD_OUTPUT_HANDLE, h)) {
std::fprintf(stderr, "`SetStdHandle` failed with error %d\n", (int)GetLastError());
return EXIT_FAILURE;
}
int h_desc = _open_osfhandle((long)h, 0);
_dup2(h_desc, STDOUT_FILENO);
std::printf("test\r\n"); // This actually writes to `h`.
std::fflush(stdout);
std::cout << "another test" << std::endl; // Also writes to `h`
CloseHandle(h);
return EXIT_SUCCESS;
}
По сути, этот трюк позволяет перенаправлять все записи в stdout
, std::cout
и GetStdHandle(STD_OUTPUT_HANDLE)
на записываемую ручку по вашему выбору (h
).Конечно, вы можете использовать CreatePipe
, чтобы создать доступный для записи дескриптор (h
) и читать с читаемого конца в другом потоке.
EDIT: Есливы ищете кроссплатформенное решение, обратите внимание, что этот прием еще проще в POSIX-совместимых системах, потому что dup2
- стандартная функция в unistd.h
, а «записываемые дескрипторы» - уже дескрипторы.1023 *