C 控制台中的屏幕缓冲区
我正在创建一个用于读写的控制台应用程序。我已经使用“CreateConsolesScreenbuffer”创建了用于读写的屏幕缓冲区。我将写入控制台,但无法读取用户的输入。我已经添加了代码C 控制台中的屏幕缓冲区,c,console-application,C,Console Application,我正在创建一个用于读写的控制台应用程序。我已经使用“CreateConsolesScreenbuffer”创建了用于读写的屏幕缓冲区。我将写入控制台,但无法读取用户的输入。我已经添加了代码 #include <windows.h> #include <stdio.h> #define BUFSIZE 4096 int main(void) { CHAR chBuf[BUFSIZE]; DWORD dwRead, dwWritten,dwFlags,fdwMo
#include <windows.h>
#include <stdio.h>
#define BUFSIZE 4096
int main(void)
{
CHAR chBuf[BUFSIZE];
DWORD dwRead, dwWritten,dwFlags,fdwMode;
HANDLE hWrite;
WORD wOldColorAttrs,len;
SECURITY_ATTRIBUTES saAttr;
FILE *FD = NULL;
FD = fopen ( "temp7.txt","w+");
AllocConsole();
LPSTR lpszPrompt1 = "********** Hi I am here ************* \n";
hWrite = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);
SetConsoleActiveScreenBuffer(hWrite);
GetConsoleMode(hWrite,&dwFlags);
fdwMode = dwFlags & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if (!SetConsoleMode(hWrite, fdwMode))
{
MessageBox(NULL, TEXT("SetConsoleMode"), TEXT("Console Error"), MB_OK);
return 1;
}
fprintf(FD," ********** Flag for Get Console is %d ************ \n",dwFlags);
if ( WriteConsole(hWrite,lpszPrompt1,strlen(lpszPrompt1),len,NULL)!= 0)
{
fprintf(FD," ********** Buffer Written %d and %d ************* \n",GetLastError(),hWrite);
MessageBox(NULL, TEXT("SetConsoleMode"), TEXT("Write Error"), MB_OK);
return 1;
}
for (;;)
{
if ( ReadFile(hWrite,chBuf,255,&dwRead,NULL)!= 0 ) // not overlapped
{
fprintf(FD," ********** Error Receiving User Buffer %d and %d ************* \n",GetLastError(),hWrite);
break;
}
fprintf(FD," ********** Following is the Buffer (%d) Received from user ************* \n",dwRead);
fprintf(FD," %s", chBuf);
if( chBuf[0]== 'q')
{
fprintf(FD," ********** User Pressed Quit************* \n");
break;
}
chBuf[0]='\0';
}
getch();
return 0;
}
请帮忙
~Johnnie您应该使用null终止用户输入的字符串,ReadFile不会自动执行此操作
chBuf[ dwRead ] = 0;
您应该使用null终止用户输入的字符串,ReadFile不会自动执行此操作
chBuf[ dwRead ] = 0;
谢谢你的投入。我发现了错误。CreateConsolesScreenbuffer可用于输出缓冲区。此外,windows提供了一种使用CONIN$和cONOUT$创建文件的方法,该文件只不过是控制台输入和输出缓冲区文件。即使标准的输入和输出被重定向,该缓冲区也将是进程控制台的缓冲区
hRead=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
hWrite=CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
问候
约翰尼谢谢你的投入。我发现了错误。CreateConsolesScreenbuffer可用于输出缓冲区。此外,windows提供了一种使用CONIN$和cONOUT$创建文件的方法,该文件只不过是控制台输入和输出缓冲区文件。即使标准的输入和输出被重定向,该缓冲区也将是进程控制台的缓冲区
hRead=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
hWrite=CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
问候
约翰尼