Home > Blockchain >  ReadFile only returns after newline
ReadFile only returns after newline

Time:11-11

I'm trying to read every character pressed in my console in realtime.
I'm using ReadFile to read from stdin, but it seems to only complete the read operation after a newline (when I press enter).
Here is my code:

    char buf[1] = { 0 };
    HANDLE stdInHandle = GetStdHandle(STD_INPUT_HANDLE), stdOutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    while (true) {
        ReadFile(stdInHandle, buf, sizeof(buf), NULL, NULL);
        WriteFile(stdOutHandle, buf, sizeof(buf), NULL, NULL);
    }

How would I read the characters pressed realtime, instead of after a newline?

CodePudding user response:

As I've mentioned in a comment you could use SetConsoleMode to disable line-buffering:

#include <windows.h>

int main()
{
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

    // Get the current console mode
    DWORD mode;
    GetConsoleMode(hInput, &mode);

    // Save the current mode, so we can restore it later
    DWORD original_mode = mode;

    // Disable the line input mode
    mode &= ~ENABLE_LINE_INPUT;

    // And set the new mode
    SetConsoleMode(hInput, mode);

    // Then read and write input...
    for (;;)
    {
        TCHAR buffer[1];
        DWORD nread = 0;

        // TODO: Need to add some error checking here!
        ReadConsole(hInput, buffer, 1, &nread, nullptr);
        WriteConsole(hOutput, buffer, nread, nullptr, nullptr);

        // Allow some way to exit the program
        if (buffer[0] == 'q' || buffer[0] == 'Q')
        {
            break;
        }
    }

    // Restore the original console mode
    SetConsoleMode(hInput, original_mode);
}

CodePudding user response:

The function _getch gets character from the console without echo. Return 0 only if you press F1 ... F12 keys

#include <iostream>
#include <conio.h>

using namespace std;


int main(){
    char ch;

    while (ch = (char)_getch()){
        cout << ch;

        if (ch == '\r')
            cout << endl;
    }

    return 0;
}

  • Related