在dart中读取文件并拆分字符串在console中的结果与在vscode中的结果不同

在dart中读取文件并拆分字符串在console中的结果与在vscode中的结果不同,dart,printing,terminal,file-read,Dart,Printing,Terminal,File Read,我是dart新手,我试图从txt文件中读取信息,并使用数据从类中创建对象(在本例中是关于口袋妖怪的),但当我在终端中运行程序时,它不会打印正确的信息,当我在vscode中运行程序时(带有dart扩展名,“运行”按钮)它在调试控制台中打印正确的信息。有什么问题 当我在vscode中运行程序时,我在我的print方法(printP)中得到了这个(这就是我想要的) vscode: Print method: 1+: Bulbasaur GRASS | POISON 但是当我在终端运行程序时,我得到了

我是dart新手,我试图从txt文件中读取信息,并使用数据从类中创建对象(在本例中是关于口袋妖怪的),但当我在终端中运行程序时,它不会打印正确的信息,当我在vscode中运行程序时(带有dart扩展名,“运行”按钮)它在调试控制台中打印正确的信息。有什么问题

当我在vscode中运行程序时,我在我的print方法(printP)中得到了这个(这就是我想要的)

vscode:

Print method:
1+: Bulbasaur GRASS | POISON
但是当我在终端运行程序时,我得到了这个

终端:

Print method:
 | POISONsaur
这是省道代码

主飞镖

import 'dart:io';
import 'pokemon.dart';

void main() {
  var file = new File("/home/ariel/Documents/script/pokemon.txt");
  String str = file.readAsStringSync();
  var pokes = str.split("[");
  pokes = pokes.sublist(1, pokes.length);
  getPokemon(pokes[0]).printP();
}

Pokemon getPokemon(String str) {
  Pokemon p = new Pokemon();
  print("string: " + str);
  var aux = str.split("\n");
  print(aux.length);
  for (var i in aux) {
    print("line: " + i);
  }
  p.number = int.parse(aux[0].split("]")[0]);
  p.name = aux[1].split("=")[1];
  p.type1 = aux[3].split("=")[1];
  p.type2 = aux[4].split("=")[1];
  return p;
}

口袋妖怪飞镖

class Pokemon {
  String _name, _type1, _type2;
  int _number;

  Pokemon() {
    this._name = "";
    this._number = 0;
    this._type1 = "";
    this._type2 = "";
  }

  void printP() {
    print("Print method:");
    print("${this._number}+: ${this._name} ${this._type1} | ${this._type2}");
  }

  void set number(int n) {
    this._number = n;
  }

  void set name(String nm) {
    this._name = nm;
  }

  void set type1(String t) {
    this._type1 = t;
  }

  void set type2(String t) {
    this._type2 = t;
  }
}


这是txt文件

口袋妖怪

[1]
Name=Bulbasaur
InternalName=BULBASAUR
Type1=GRASS
Type2=POISON
BaseStats=45,49,49,45,65,65
GenderRate=FemaleOneEighth
GrowthRate=Parabolic
BaseEXP=64
EffortPoints=0,0,0,0,1,0
Rareness=45
Happiness=70
Abilities=OVERGROW
HiddenAbility=CHLOROPHYLL
Moves=1,TACKLE,3,GROWL,7,LEECHSEED,9,VINEWHIP,13,POISONPOWDER,13,SLEEPPOWDER,15,TAKEDOWN,19,RAZORLEAF,21,SWEETSCENT,25,GROWTH,27,DOUBLEEDGE,31,WORRYSEED,33,SYNTHESIS,37,SEEDBOMB
EggMoves=AMNESIA,CHARM,CURSE,ENDURE,GIGADRAIN,GRASSWHISTLE,INGRAIN,LEAFSTORM,MAGICALLEAF,NATUREPOWER,PETALDANCE,POWERWHIP,SKULLBASH,SLUDGE
Compatibility=Monster,Grass
StepsToHatch=5355
Height=0.7
Weight=6.9
Color=Green
Habitat=Grassland
Kind=Seed
Pokedex=Almacena energía en el bulbo de su espalda para alimentarse durante épocas de escasez de recursos o para atacar liberándola de golpe.
BattlerPlayerY=0
BattlerEnemyY=25
BattlerAltitude=0
Evolutions=IVYSAUR,Level,16


您的代码取决于txt文件的换行格式。我建议您使用
dart:convert
中的类分割行

问题是Windows换行符同时包含
'\n'
'\r'
,但您只删除了
'\n'
部分<代码>'\r'是必需的,这意味着终端应将光标设置回行的开头

你可以像一台打字机一样阅读这篇文章,你首先将标题向后移动,然后将纸张移动到下一行。并且可以阅读更多关于此主题的信息:

LineSplitter
类的目的是抽象所有这些逻辑,并获得一些可以在所有平台上工作的行为

因此导入
dart:convert
并更改此行:

var aux = str.split("\n");
进入:


我非常感谢您提供了运行程序和重现问题所需的所有细节。它解决了问题,现在我怀疑,为什么vscode只使用split以正确的方式运行程序?原因是并非所有终端都支持
\r
操作,因为它真正的意思是我们将光标设置回同一行的开头,并允许覆盖现有字符。vscode不支持这种行为是有道理的,因为这里的终端更多的是用于日志记录,而不是用于模拟实际的终端。
var aux = LineSplitter.split(str).toList();