Попытка получить наибольшее значение int в каждой строке файла и суммировать результат - PullRequest
1 голос
/ 16 января 2012

Когда я пытаюсь запустить свой код, я получаю сообщение об ошибке:

Входная строка была в неправильном формате.

Я пытаюсь найти наибольшее значение int в каждой строке текстового файла, а затем добавить их все.

Я уверен, что в этом файле нет букв, и все разделены пробелом.

Вот мой код:

int counter = 0;
string line;

List<int> col = new List<int>();

// Read the file and display it line by line.
System.IO.StreamReader file =
    new System.IO.StreamReader(label3.Text);
while ((line = file.ReadLine()) != null)
{
    int[] storage = new int[10000];

    Console.WriteLine(line);
    counter++;
    string s = line;

    string[] words = s.Split(' ');

        for (int i = 0; i < words.Length; i++)
        {
            storage[i] = Convert.ToInt32(words[i]);

        }

        int large = storage.Max();

        col.Add(large);
        Console.WriteLine(" ");

        foreach (int iii in col)
        { 
            Console.WriteLine(iii); 
        }

        int total = col.Sum();
        Console.WriteLine(total);

}

file.Close();

// Suspend the screen.
Console.ReadLine();

Ответы [ 4 ]

2 голосов
/ 16 января 2012

Возможно, целевая строка не может быть сохранена в 32-битном целом числе.Вы можете попробовать разбор до ulong типа.Взгляните на Таблица интегральных типов и Таблица типов с плавающей запятой .

Вместо выполнения Convert.ToInt32(), попробуйте int.TryParse().Он вернет значение bool, сообщающее вам, если операция прошла успешно, и у него есть параметр out, в который он поместит результат операции разбора.Операция TryParse также доступна для других числовых типов, если вы решите, что они вам нужны.

Например

int val;
string strVal = "1000";
if (int.TryParse(strVal, out val))
{
  // do something with val
}
else
{
  // report error or skip
}
0 голосов
/ 16 января 2012

Вы конвертируете не по размеру или пытаетесь разобрать возвратную каретку '/ r'

Убедитесь, что вы обрезаете ввод.

Мое решение:

    static void Main(string[] args)
    {
        int linecount = 100;

        string path = @"C:\test\test.txt";
        Random rand = new Random();

        //Create File
        StreamWriter writer = new StreamWriter(path, false);
        for (int i = 0; i < linecount; i++)
        {
            for (int j = 0; j < rand.Next(10, 15); j++)
            {
                writer.Write(rand.Next() + " ");
            }
            writer.WriteLine("");
        }

        writer.Close();


        //Sum File
        long sum = Enumerable.Sum<string>(
            (new StreamReader(path)).ReadToEnd().Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries),
            l => Enumerable.Max(
                l.Split(' '),
                i => String.IsNullOrEmpty(i.Trim()) ? 0 : long.Parse(i.Trim())
                )
            );
    }
0 голосов
/ 16 января 2012

Я считаю, что строка в вашем коде, которая может вызвать эту ошибку:

Convert.ToInt32(words[i]);

Теперь, когда вы запускаете это приложение в режиме отладки (которым вы, вероятно, являетесь) в Visual Studio, у вас естьспособ проверить, что происходит в вашей программе, когда происходит исключение.

В самом низу вашего экрана будут несколько вкладок.эти вкладки включают в себя ваш список ошибок среди прочего.Те, которые мне нравятся, называются «Местные жители» и «Часы».Вы можете использовать вкладку Locals.

Когда вы нажимаете на вкладку Locals, вы должны увидеть древовидную структуру всех локальных переменных в вашей программе.если вы развернете переменную words, вы должны увидеть все отдельные элементы массива.вы также должны видеть переменную, я проверяю i-й член вашего массива слов и проверяю, что это целое число, а не что-то еще.

0 голосов
/ 16 января 2012

Я сделал быстрый тест, и, скорее всего, вы получите ошибку в строке

 storage[i] = Convert.ToInt32(words[i]);

Если это так, убедитесь, что вы пытаетесь преобразовать, например, целое число, а не пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...