![]() |
#2
yiyue1232020-06-17 12:43
|
根据文档的描述,ReadConsole 是直接从控制台缓冲区中读取字符,WriteConsole 直接将字符写入到控制台的输入缓冲区
看到这里,不禁联想到了 C 标准库提供的 stdio,和其中的 标准文件描述符 stdin,stdout, stderr。stdin,stdout 都是有它们自己的缓冲区的。
那么控制台的缓冲区和标准流的缓冲区之间有什么关系呢?

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
int main(void)
{
HANDLE hStream;
hStream = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD num_written;
int ok;
TCHAR out[] = TEXT("hello");
ok = WriteConsole(hStream, out, wcslen(out), &num_written, NULL);
if (!ok)
{
MessageBox(NULL, TEXT("failure"), TEXT("1"), MB_OK);
}
CloseHandle(hStream);
ok = printf("World");
char buffer[10];
sprintf_s(buffer, 10, "%d", ok);
MessageBoxA(NULL, buffer, "2", MB_OK)
return 0;
}
这段代码编译并运行,可以在控制台上看到 Hello,但是看不到 World,而且 MessageBox 弹窗显示的值是 5,说明 printf 调用成功了。
个人理解: printf 成功的将输 World 写入到了输出缓冲,但是标准输出句柄已经被关闭,所以无法显示到屏幕

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
int main(void)
{
HANDLE hStream;
hStream = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD num_written;
int ok;
TCHAR out[] = TEXT("hello");
ok = WriteConsole(hStream, out, wcslen(out), &num_written, NULL);
if (!ok)
{
MessageBox(NULL, TEXT("failure"), TEXT("1"), MB_OK);
}
//CloseHandle(hStream);
fclose(stdout);
ok = WriteConsole(hStream, out, wcslen(out), &num_written, NULL);
if (!ok)
{
MessageBox(NULL, TEXT("failure2"), TEXT("1"), MB_OK);
}
return 0;
}
这段代码会弹出窗口,显示 failure2。说明 第二次 WriteConsole 调用失败。
请问,控制台和流的缓冲区之间有什么样的关系?