控制台 I/O 和流 I/O 的区别
看了看微软的官方文档,对于控制台应用,它提供了相应的 I/O 函数 ReadConsole 和 WriteConsole。根据文档的描述,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 调用失败。
请问,控制台和流的缓冲区之间有什么样的关系?