2

要临时重定向stdout到文件,我正在做:

printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w", stdout);
printf("After");

那行得通,但是这样做:

CONSOLE_SCREEN_BUFFER_INFO sbi = {0};
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi);

似乎不再起作用。它正在返回 false 并且GetLastError()正在返回6,这会转化为消息“句柄无效”。与FormatMessage.

关于为什么句柄可能无效的任何建议?有趣的是,printf继续按预期工作,SetConsoleTextAttribute甚至使用相同的句柄。

4

1 回答 1

4

我在这里发现了以下内容:

hConsoleOutput [输入]

控制台屏幕缓冲区的句柄。句柄必须具有 GENERIC_READ 访问权限。有关详细信息,请参阅控制台缓冲区安全和访问权限。

因此,我希望为重新打开添加读取访问权限将恢复预期的功能,例如:

printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w+", stdout);
printf("After");
于 2009-11-07T01:15:19.077 回答