41

stdinDartでコンソール入力を読み取るにはどうすればよいですか?

scanfダートにありますか?

4

8 に答える 8

55

stdinreadLineSync()メソッドを使用すると、コンソールから文字列をキャプチャできます。

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

void main() {
  print('1 + 1 = ...');
  var line = stdin.readLineSync(encoding: utf8);
  print(line?.trim() == '2' ? 'Yup!' : 'Nope :(');
}

古いバージョン:

import 'dart:io';

main() {
    print('1 + 1 = ...');
    var line = stdin.readLineSync(encoding: Encoding.getByName('utf-8'));
    print(line.trim() == '2' ? 'Yup!' : 'Nope :(');
}
于 2013-08-12T11:57:17.223 に答える
18

以下は、stdinからの入力を読み取るための最新のdartコードである必要があります。

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);
}
于 2013-10-15T20:33:22.990 に答える
12
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()を使用する必要があります。

于 2019-01-18T12:36:05.917 に答える
4

StringInputStreamのようなM3dartクラスが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. */);


}
于 2013-03-15T18:55:26.253 に答える
2

Dart 2.12以降、null-safetyが有効になり、の代わりにをstdin.readLineSync()返すようになりました。String?String

これは明らかに多くの人々を混乱させてきました。null-safetyの意味を理解するには、 https://dart.dev/null-safety/understanding-null-safetyを読むことを強くお勧めします。

具体的には、最初にstdin.readLineSync()チェックすることでこれを解決できます。ローカル変数の場合、これは自動的にに昇格します。ここではいくつかの例を示します。nullString?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()!。理由でreadLineSyncaを返します。入力がなくなると戻ります。nullアサーション演算子( )を使用すると、実行時例外が要求されます。String?null!

于 2021-04-06T09:03:31.860 に答える
1

あなたの呼び出しはブロックされstdin.readLineSync()ますが、他の呼び出しは完了しないことに注意してください。isolate/threadFuture

ブロック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 ;
  });
}

于 2021-03-04T00:21:59.703 に答える
0

次の行を使用して、ユーザーから文字列を読み取ることができます。

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");
   * */
}
于 2021-03-24T15:02:13.357 に答える
0

これらの非同期APIreadLine*()ベースのソリューションはすべて、同期ブロッキングなしですべてを実行できる構文糖衣構文を欠いていますが、同期コードのように記述されています。これは、同期的に実行するコードを作成する他の言語から来ると、さらに直感的になります。

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

Future<void> main() async {
  var lines = stdin.transform(utf8.decoder).transform(const LineSplitter());
  
  await for (final l in lines) {
    print(l);
  }
  print("done");
}

ここでの重要なポイントは、とを利用することasyncですawait

  • asyncawait非同期API呼び出しとのインターフェースに使用しているため、メソッドにが必要です
  • await forは、で「同期のような」コードを実行するStreamための構文です(aに対応する構文Futureはちょうどですawait)。

何かを処理できるようになったら、次のコードを実行して、 /をawait「アンラップ」するようなものと考えてください。これで、作業を行うためにメインスレッド()をブロックしなくなりました。StreamFutureIsolate

詳細については、async/awaitのDartコードラボを参照してください。

(補足:関数の戻り値を宣言する正しい方法は、async関数をで囲むことです。Futureしたがって、Future<void>ここにあります。)

于 2022-01-06T21:16:48.773 に答える