Как мне прочитать ввод консоли / стандартный ввод в Dart?

Как мне прочитать ввод консоли от stdin в Dart?

Есть ли scanf в Дротике?


person Seth Ladd    schedule 20.06.2012    source источник


Ответы (7)


Метод readLineSync () для stdin позволяет захватывать строку из консоли:

import 'dart:io';

main() {
    print('1 + 1 = ...');
    var line = stdin.readLineSync(encoding: Encoding.getByName('utf-8'));
    print(line.trim() == '2' ? 'Yup!' : 'Nope :(');
}
person Renaud Denis    schedule 12.08.2013

Ниже должен быть самый последний код дротика для чтения ввода со стандартного ввода.

import 'dart:async';
import 'dart:io';
import 'dart:convert';

void main() {
  readLine().listen(processLine);
}

Stream<String> readLine() => stdin
    .transform(utf8.decoder)
    .transform(const LineSplitter());

void processLine(String line) {
  print(line);
}
person nobody    schedule 15.10.2013

import 'dart:io';

void main(){
  stdout.write("Enter your name : ");
  var name = stdin.readLineSync();
  stdout.write(name);
}

Выход

Enter your name : Jay
Jay

По умолчанию readLineSync () принимает ввод в виде строки. Но если вам нужен целочисленный ввод, вам нужно использовать parse () или tryparse ().

person Jay Tillu    schedule 18.01.2019
comment
Почему бы вам просто не использовать print вместо stdout? - person Themelis; 21.03.2019
comment
Да, мы можем использовать печать. Я просто привыкаю к ​​stdout, поэтому и использую. - person Jay Tillu; 22.03.2019
comment
stdout предоставляет больше функциональных возможностей, чем функция print (). Например, вы можете отобразить содержимое потока с помощью stdout. Однако вы должны использовать print () вместо stdout для программ, которые конвертируются в JavaScript и запускаются на нем. Прочтите: dart.dev/tutorials/server/cmdline - person Daryll David Dagondon; 04.09.2019

В M3 классы дротиков, такие как StringInputStream, заменены на Stream, попробуйте это :

import 'dart:io';
import 'dart:async';

void main() {
  print("Please, enter a line \n");
  Stream cmdLine = stdin
      .transform(new StringDecoder())
      .transform(new LineTransformer());

  StreamSubscription cmdSubscription = cmdLine.listen(
    (line) => print('Entered line: $line '),
    onDone: () => print(' finished'),
    onError: (e) => /* Error on input. */);


}
person joan    schedule 15.03.2013

Начиная с Dart 2.12, включена нулевая безопасность, и stdin.readLineSync() теперь возвращает String? вместо String.

Это явно сбивало с толку многих людей. Я настоятельно рекомендую прочитать https://dart.dev/null-safety/understanding-null-safety, чтобы понять, что означает нулевая безопасность.

В частности, для stdin.readLineSync() вы можете решить эту проблему, сначала проверив null, который для локальных переменных автоматически повысит String? до String. Вот некоторые примеры:

// Read a line and try to parse it as an integer.
String? line = stdin.readLineSync();
if (line != null) {
  int? num = int.tryParse(line); // No more error about `String?`.
  if (num != null) {
    // Do something with `num`...
  }
}
// Read lines from `stdin` until EOF is reached, storing them in a `List<String>`.
var lines = <String>[];
while (true) {
  var line = stdin.readLineSync();
  if (line == null) {
    break;
  }
  lines.add(line); // No more error about `String?`.
}
// Read a line.  If EOF is reached, treat it as an empty string.
String line = stdin.readLineSync() ?? '';

Обратите внимание: не слепо делать stdin.readLineSync()!. readLineSync возвращает String? по какой-то причине: он возвращает null, когда больше нет ввода. При использовании оператора нулевого утверждения (!) запрашивается для исключения времени выполнения.

person jamesdlin    schedule 06.04.2021

Обратите внимание, что при вызове stdin.readLineSync() ваш isolate/thread будет заблокирован, другие Future не будут выполнены.

Если вы хотите читать строку stdin String асинхронно, избегая блока isolate/thread, вот способ:

import 'dart:async';
import 'dart:convert';
import 'dart:io';

/// [stdin] as a broadcast [Stream] of lines.
Stream<String> _stdinLineStreamBroadcaster = stdin
    .transform(utf8.decoder)
    .transform(const LineSplitter()).asBroadcastStream() ;

/// Reads a single line from [stdin] asynchronously.
Future<String> _readStdinLine() async {
  var lineCompleter = Completer<String>();

  var listener = _stdinLineStreamBroadcaster.listen((line) {
    if (!lineCompleter.isCompleted) {
      lineCompleter.complete(line);
    }
  });

  return lineCompleter.future.then((line) {
    listener.cancel();
    return line ;
  });
}

person GMP    schedule 04.03.2021

Вы можете использовать следующую строку, чтобы прочитать строку от пользователя:

String str = stdin.readLineSync();

ИЛИ следующую строку, чтобы прочитать число

int n = int.parse(stdin.readLineSync());

Рассмотрим следующий пример:

import 'dart:io'; // we need this to use stdin
void main()
{
    // reading the user name
    print("Enter your name, please: ");
    String name = stdin.readLineSync();
  
    // reading the user age
    print("Enter your age, please: ");
    int age = int.parse(stdin.readLineSync());
  
    // Printing the data
    print("Hello, $name!, Your age is: $age");
  
  /* OR print in this way
   * stdout.write("Hello, $name!, Your age is: $age");
   * */
}
person Mostafa Wael    schedule 24.03.2021