2010-07-03 10 views
0

При использовании Console.Read() реализация, похоже, думает, что как только вы нажмете enter, вы ввели достаточно байтов для вечности чтения. Например, если Read вызывается дважды в строке, вы не можете ввести одно значение в одну строку, нажмите enter и перейдите к следующему. Даже если вы ввели только один символ, Read просто возвращает ноль (Edit: or one. Я не уверен). У меня тоже есть проблема с ReadLine. Я пытаюсь сохранить консоль открытой для ввода после завершения программы (у меня есть приложение WPF и используется AllocConsole вручную) и/или запрашивать пользователя для каждого отдельного фрагмента ввода. Но это не работает. Есть ли какая-нибудь кнопка, чтобы попросить ее заблокировать, если нет ввода?Любопытная проблема с консольным вводом в C#

Я написал интерпретатор Brainfuck, а примеры программ из Wiki приводят к предполагаемому результату, если они не используют ввод.

Что я хочу сделать, это ввести один символ, нажать enter, получить этот символ как символ, повторить.

+0

Можете ли вы поделиться каким-то кодом, Console.ReadLine должен принимать ввод до ввода не будет нажат, а затем последующее Console.ReadLine будет принимать дополнительные материалы до введите нажатие. –

+0

Но тогда у меня будет строка. Чтение возвращает int. – Puppy

+0

, поэтому вы хотите читать по одному ключу за раз? Если так, то Console.ReadKey может быть тем, что вы ищете? –

ответ

1

После вашего последнего изменения я ожидаю, что часть кода ниже может предоставить либо то, что вы хотите, либо указать вам в правильном направлении.

public static int ReadLastKey() 
{ 
    int lastKey = -1; 
    for(;;) 
    { 
    ConsoleKeyInfo ki = Console.ReadKey(); 
    if (ki.Key != ConsoleKey.Enter) 
    { 
     lastKey = (int)ki.KeyChar;   
    } 
    else 
    { 
     return lastKey; 
    } 
    }  
} 

Функция ReadLastKey считывает нажатия клавиш и возвращает последнюю нажатую клавишу при нажатии клавиши ввода.

Конечно, если вы не хотите записывать несколько нажатий клавиш, вы можете удалить цикл и просто использовать Console.ReadKey дважды, один раз, чтобы нажать клавишу, а затем второй раз, чтобы дождаться клавиши ввода. Или какая-то перестановка одного из них.

Вот простая версия функции, которая позволит только одному нажатию клавиши, а затем ждать нажатия клавиши ввода. Обратите внимание, что это очень упрощенно, вы можете обрабатывать другие условия выхода и т.д.

public static int ReadLastKey() 
{ 
    int lastKey = -1; 
    ConsoleKeyInfo ki; 

    // Read initial key press 
    ki = Console.ReadKey(); 

    // If it is enter then return -1 
    if (ki.Key == ConsoleKey.Enter) return lastKey; 

    lastKey = (int)ki.KeyChar; 

    // Wait for the user to press enter before returning the last key presss, 
    // and do not display key the errant key presses. 
    do 
    { 
    ki = Console.ReadKey(true); 
    } while (ki.Key != ConsoleKey.Enter); 

    return lastKey;  
} 
+0

Первая функция работает достаточно хорошо для моих целей - это вряд ли профессиональный проект. Когда мне нужно что-то лучшее, я могу просто использовать C++/CLI-обертку на cout. – Puppy

Смежные вопросы