Как мне прочитать ввод консоли от stdin
в Dart?
Есть ли scanf
в Дротике?
Как мне прочитать ввод консоли от stdin
в Dart?
Есть ли scanf
в Дротике?
Метод readLineSync () для stdin позволяет захватывать строку из консоли:
import 'dart:io';
main() {
print('1 + 1 = ...');
var line = stdin.readLineSync(encoding: Encoding.getByName('utf-8'));
print(line.trim() == '2' ? 'Yup!' : 'Nope :(');
}
Ниже должен быть самый последний код дротика для чтения ввода со стандартного ввода.
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);
}
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 ().
print
вместо stdout
?
- person Themelis; 21.03.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. */);
}
Начиная с 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
, когда больше нет ввода. При использовании оператора нулевого утверждения (!
) запрашивается для исключения времени выполнения.
Обратите внимание, что при вызове 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 ;
});
}
Вы можете использовать следующую строку, чтобы прочитать строку от пользователя:
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");
* */
}