Попытка загрузить int из файла в 2d массив, получив сообщение об ошибке «Неправильный формат входной строки» - PullRequest
1 голос
/ 04 ноября 2019

Я пытался выполнить задание для своего класса игрового дизайна в C #, одна из проблем, с которыми я столкнулся, заключается в том, что я не могу загрузить свой текстовый файл Save1.GAME со всей информацией о загрузке, я получаю «Систему». .FormatException: 'Входная строка была не в правильном формате.' 'Ошибка.

На данный момент это назначение включает в себя небольшую панель, где вы, игрок, проектируете Сокобан (https://en.wikipedia.org/wiki/Sokoban) карта,Я уже выполнил эту часть, и теперь я должен загрузить этот файл сохранения в свою программу, а затем сгенерировать «плитки» (плитки просто представляют собой маленькие квадраты, где находятся элементы) на другой панели, где будет фактически выполняться игра.

До сих пор я пытался загрузить файл и записать его в строковый массив строка за строкой. Я также пытался записать весь файл в строку и использовать функцию .split (','),безрезультатно. Я попробовал довольно много идей, которые, если честно, я забыл каждую из них.


Моя кнопка загрузки в форме, в которую будет играть игра:

private void loadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog openLevelDialog = new OpenFileDialog();
            openLevelDialog.Title = "Select level to load";



            if (openLevelDialog.ShowDialog() == DialogResult.OK)
            {

                string MyString = System.IO.File.ReadAllText(openLevelDialog.FileName);


                int i = 0;
                int j = 0;

                //My array where I will just dump the whole file into.
                int[,] result = new int[10, 10];

                //foreach loop where I attempt to go line-by-line and split the individual numbers by ','
                foreach (var row in MyString.Split('\n'))
                {
                    j = 0;
                    foreach (var col in row.Trim().Split(','))
                    {
                        result[i, j] = int.Parse(col.Trim()); //Exception happens here.
                        j++;
                    }
                    i++;
                }

                //Just an attempt to display what the variable values in my form, ignore this part.
                for (int a = 0; a < result.GetLength(0); a++)
                {
                    for (int w = 0; w < result.GetLength(1); w++)
                    {
                        label1.Text += result[a,w].ToString();
                    }
                }  
            }
        }

А это файл Game1.GAME

2,2 <--- Это размер карты, 2X2 = всего 4 плитки. --- </p>

0,0,0 <--- Это плитка [0,0], и, согласно моему перечислению TileTypes внутри моего класса tile.cs, она должна быть пустой, следовательно, третий 0. -- </p>

0,1,1 <--- Это плитка [0,1], и согласно моему перечислению TileTypes внутри моего класса tile.cs это должно быть "Герой", следовательно, 1. -- </p>

1,0,2 <--- Это плитка [1,0], и согласно моему перечислению TileTypes внутри моего класса tile.cs это должна быть стена, следовательно, 2. --- </p>

1,1,3 <--- Это плитка [1,1], и согласно моему перечислению TileTypes внутри моего класса tile.cs это должно быть поле, следовательно, 3. --- </p>

примечание: есть 4-е перечисление со значением "Пункт назначения", но на этой конкретной карте я просто не добавил ничего.

Как это обычно выглядит

2,2
0,0,0
0,1,1
1,0,2
1,1,3

Я надеялся, что он просто загрузит строку, разделит ее на массив int, но, похоже, я не смог преодолеть исключение независимо от того, что я делаю.

Спасибо за вас 'время заранее.


Вот мой файл изнутри заметкиpad ++

My System.IO return

1 Ответ

1 голос
/ 04 ноября 2019

Исходя из предоставленной вами информации, вы видите ошибку в последней строке, потому что перевод строки в конце вашей последней записи.

Один из способов справиться с этим - проверить, является ли row Null, Empty, Whitespace в вашей итерации и continue ваш цикл, если это условие true.

foreach (var row in MyString.Split('\n')) 
{
   //skip iteration if row is null, empty, or whitespace
   if (string.IsNullOrWhitespace(row))
      continue;
...