使用高级输入和输出函数

【勇芳软件工作室】汉化HomePreviousNext

以下示例使用控制台I / O的高级控制台I / O功能。有关高级控制台I / O功能的更多信息,请参阅高级控制台I / O.

该示例假定默认的I / O模式最初对第一次调用ReadFileWriteFile功能生效。然后,输入模式更改为关闭线路输入模式和回波输入模式,用于第二次拨打ReadFileWriteFile.SetConsoleTextAttribute功能用于设置随后写入的文本将显示的颜色。退出之前,程序恢复原始控制台输入模式和颜色属性。

当线路输入模式被禁用时,使用示例的NewLine功能。它通过将光标位置移动到下一行的第一个单元格来处理回车。如果光标已经在屏幕缓冲区的最后一行,屏幕缓冲区的内容将向上滚动一行。有关使用ScrollConsoleScreenBuffer功能滚动屏幕缓冲区的示例,请参阅滚动屏幕缓冲区的内容.

#include < windows.h >

VOID NewLine(VOID);

VOID ScrollScreenBuffer(HANDLE, INT);

HANDLE hStdout, hStdin;

CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

VOID main(void){

LPSTR lpszPrompt1 = "Type something and press Enter:\n";

LPSTR lpszPrompt2 = "Type any key: ";

CHAR chBuffer[256];

DWORD cRead, cWritten, fdwMode, fdwOldMode;

WORD wOldColorAttrs;

/ *获取STDIN和STDOUT的句柄。*/

hStdin = GetStdHandle(STD_INPUT_HANDLE);

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

if (hStdin == INVALID_HANDLE_VALUE ||

hStdout == INVALID_HANDLE_VALUE)

MyErrorExit("GetStdHandle");

/ *保存当前文本颜色。*/

if(!GetConsoleScreenBufferInfo(hStdout,& csbiInfo))

MyErrorExit("GetConsoleScreenBufferInfo");

wOldColorAttrs = csbiInfo.wAttributes;

/ *设置文本attr。在黑色背景上画红色文本。*/

if(!SetConsoleTextAttribute(hStdout,FOREGROUND_RED))

MyErrorExit("SetConsoleTextAttribute");

/*

*写入STDOUT并使用默认值从STDIN读取

*模式。InputFile自动回显输入

*输入回车之前不返回。

*

*默认输入模式为线,处理和回显。

*处理默认输出模式并在EOL进行换行。

*/

而(1){

if(!WriteFile(

hStdout,/ *输出句柄* /

lpszPrompt1,/ *提示符串* /

lstrlen(lpszPrompt1),/ * string length * /

& cWritten,/ * bytes written * /

NULL))/ *不重叠* /

break;

if(!ReadFile(

hStdin,/ *输入句柄* /

chBuffer,/ *缓冲区读入* /

255,/ *缓冲区大小* /

& cRead,/ *实际字节读* /

NULL))/ *不重叠* /

break;

if (chBuffer[0] == 'q') break;

}

/ *关闭线路输入模式,并回显输入模式。*/

if(!GetConsoleMode(hStdin,& fdwOldMode))

MyErrorExit("GetConsoleMode");

fdwMode = fdwOldMode &

~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);

if(!SetConsoleMode(hStdin,fdwMode))

MyErrorExit("SetConsoleMode");

/ *提示输入。*/

if(!WriteFile(

hStdout,/ *输出句柄* /

lpszPrompt2,/ *提示符串* /

lstrlen(lpszPrompt2),/ * string length * /

& cWritten,/ * bytes written * /

NULL))/ *不重叠* /

MyErrorExit("WriteFile");

/*

*没有线和回声输入模式,ReadFile返回

*任何输入可用时。回车必须

*被处理,WriteFile用于回显输入。

*/

而(1){

if(!ReadFile(hStdin,chBuffer,1,& cRead,NULL))

break;

if (chBuffer[0] == '\r')

NewLine();

其他

if(!WriteFile(hStdout,chBuffer,cRead,

& cWritten,NULL))

break;

if (chBuffer[0] == 'q') break;

}

/ *恢复原始控制台模式。*/

if(!SetConsoleMode(hStdin,fdwOldMode))

MyErrorExit("SetConsoleMode");

/ *恢复原始文本颜色。*/

if(!SetConsoleTextAttribute(hStdout,wOldColorAttrs))

MyErrorExit("SetConsoleTextAttribute");

}

/*

*处理后,NewLine函数处理回车

*输入模式被禁用。它获取当前的光标位置

*并将其重置为下一行的第一个单元格。

*/

VOID NewLine(VOID){

if(!GetConsoleScreenBufferInfo(hStdout,& csbiInfo))

MyErrorExit("GetConsoleScreenBufferInfo");

csbiInfo.dwCursorPosition.X = 0;

/*

*如果是屏幕缓冲区的最后一行,请滚动

*缓冲区。

*/

if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y) {

ScrollScreenBuffer(hStdout, 1);

}

/ *否则,将光标移动到下一行。*/

其他

csbiInfo.dwCursorPosition.Y += 1;

if(!SetConsoleCursorPosition(hStdout,

csbiInfo.dwCursorPosition))

MyErrorExit("SetConsoleCursorPosition");

}