Чтение файла в дротике и разделение строки дает разные результаты в консоли, что и в vscode - PullRequest
2 голосов
/ 01 августа 2020

Я новичок в дротике, я пытаюсь прочитать информацию из txt-файла и использовать данные для создания объектов из класса (в данном случае о покемонах), но когда я запускаю свою программу в терминале, это не так. 't выводит правильную информацию, и когда я запускаю программу в vscode (с расширением dart, кнопкой "запустить"), она выводит в консоли отладки правильную информацию. В чем проблема?

Когда я запускаю программу в vscode, я получаю в моем методе печати (printP) это (это то, что я хочу)

vscode:

Print method:
1+: Bulbasaur GRASS | POISON

но когда я запускаю программу в терминале, я получаю следующее.

Терминал:

Print method:
 | POISONsaur

Вот код дротика.

main.dart

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;
}

pokemon.dart

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 файл

pokemon.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

1 Ответ

1 голос
/ 01 августа 2020

Ваш код зависит от формата новой строки вашего текстового файла. Я рекомендую вам использовать класс LineSplitter из dart:convert для разделения строк.

Проблема в том, что Windows новые строки содержат как '\n', так и '\r', но вы удаляете только часть '\n'. '\r' важны, что означает, что терминал должен установить курсор обратно в начало строки.

Вы можете читать это как пишущую машинку, где вы сначала отодвигаете головку назад и устанавливаете перемещение бумаги на следующую строку. И можно узнать больше о topi c здесь: https://en.wikipedia.org/wiki/Newline

Цель класса LineSplitter состоит в том, чтобы абстрагироваться от всего этого logi c и получить некоторые поведение, которое будет работать на всех платформах.

Итак, импортируйте dart:convert и измените эту строку:

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

на:

var aux = LineSplitter.split(str).toList();
...