2013-07-18 3 views
1

stdin.readByteSync недавно был добавлен в Dart.readByteSync - правильное поведение?

Использование stdin.readByteSync для ввода данных, я пытаюсь разрешить значение по умолчанию и если запись сделана оператором, чтобы очистить значение по умолчанию. Если запись не была сделана и нажата клавиша Enter, используется значение по умолчанию.

Однако, похоже, что терминал не отправляется на терминал до ввода символа новой строки. Поэтому, когда я делаю print() или stdout.write(), он задерживается до ввода новой строки.

Следовательно, когда оператор вводит первый символ для переопределения по умолчанию, значение по умолчанию не очищается. IE. По умолчанию «abc», введенные данные «xx», однако «xxc» отображается на экране после ввода «xx». «Проблема» заключается в том, что никакие «записи» на терминал не отправляются до ввода новой строки.

Хотя я могу найти альтернативный способ сделать это, я хотел бы знать, должно ли это работать или должно работать readByteSync. Если это так, я найду альтернативный способ сделать то, что хочу.

// Пример программы //

import 'dart:io'; 

void main() { 
    int iInput; 
    List<int> lCharCodes = []; 
    print(""); print(""); 
    String sDefault = "abc"; 
    stdout.write ("Enter data : $sDefault\b\b\b"); 
    while (iInput != 10) { // wait for newline 
    iInput = stdin.readByteSync(); 
    if (iInput == 8 && lCharCodes.length > 0) { // bs 
     lCharCodes.removeLast(); 
    } else if (iInput > 31) { // ascii printable char 
     lCharCodes.add(iInput); 
     if (lCharCodes.length == 1) 
     stdout.write (" \b\b\b\b chars cleared"); // clear line 
     print ("\nlCharCodes length = ${lCharCodes.length}"); 
    } 
    } 
    print ("\nData entered = ${new String.fromCharCodes(lCharCodes).trim()}"); 
} 

Результаты на экране команды:

c:\Users\Brian\dart-dev1\test\bin>dart testsync001.dart 


Enter data : xxc 
chars cleared 
lCharCodes length = 1 

lCharCodes length = 2 

Data entered = xx 

c:\Users\Brian\dart-dev1\test\bin> 

ответ

2

Недавно я добавил stdin.readByteSync и readLineSync, чтобы упростить создание небольших скриптов, читающих stdin. Тем не менее, две вещи все еще отсутствуют, так как это должно быть полнофункциональным.

1) Режим линии против сырого режима. Это в основном то, о чем вы просите, способ получить символ, как только он будет напечатан.

2) Эхо вкл./Выкл. Этот режим полезен, например, ввод паролей, поэтому вы можете отключить эхо символов по умолчанию.

Я надеюсь, что вы сможете реализовать и использовать эти функции довольно скоро.

Вы можете показать this bug, чтобы отслеживать его развитие!

+0

Спасибо, я проголосовал за это. Однако не следует ли readByteSync() «логически» возвращать байты по мере их ввода? Насколько я могу судить, можно использовать readLineSync(), потому что он появляется (для меня), что ничего не возвращается до ввода новой строки. –

+0

Хотя для 'readByteSync()' было бы разумно немедленно возвращаться, это не поведение по умолчанию на любой платформе. Вот почему я хочу предоставить его как вариант/режим. –

+0

Хорошо, спасибо за информацию и спасибо за добавление функций синхронизации консоли, они очень помогают. Сначала мне захотелось readLineSync(), поэтому я получил то, что отлично. Поскольку readByteSync() был там, я думал, что буду использовать его, следовательно, мой пост здесь. –

0

Это обычное поведение для консолей. Попробуйте сбросить вывод с помощью stdout.flush().

Редактировать: моя ошибка. Я посмотрел на очень старую ревизию (dartlang-test). Текущий API не предоставляет никаких средств для сброса stdout. Не стесняйтесь сообщать об ошибке.

+0

Ранее я искал метод flush(), но, похоже, он не существует. –

+0

Я также загрузил последний редактор и т. Д. (25017), но результаты не изменились до предыдущего. Мне кажется, что при запуске в отладчике readByteSync() теперь использует readLineSync(), а затем возвращает байты один за другим. Если это так, ничего не может быть сделано в программе, пока не будут введены все байты. Кроме того, если это так, это может создать проблемы для более сложных целей, чем этот пример. –

+0

Вы правы. Я посмотрел на старый пересмотр. Отредактировал ответ. –

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