StringReader не "выходит" / ломается - PullRequest
0 голосов
/ 14 декабря 2018

У меня возникла проблема с приведенным ниже кодом ... Когда я его запускаю, код никогда не завершается.Я пытался отладить это около часа, и я в полной растерянности относительно того, в чем проблема.OutputDebug ();по сути как Console.WriteLine ();

//Iterate through all lines to find sections
            using (StringReader lineReader = new StringReader(Program))
            {
                int i = 0;
                string line = string.Empty;
                while (line != null)
                {
                    line = lineReader.ReadLine();
                    if (line != string.Empty)
                    {
                        //If the program is exiting (doExit == true), then break the lööp bröther
                    if (doExit)
                            break;

                        //Iterate through all characters in the line
                        foreach (char Character in line)
                    {
                        i++;
                        OutputDebug(i.ToString());
                        if (isOnSameLineAsSectionStart)
                        {
                            sectionName += Character;
                        }
                        else if (Character == ':' && sectionName == string.Empty)
                        {
                            isOnSameLineAsSectionStart = true;
                        }
                        else if (Character == ':' && !isOnSameLineAsSectionStart && sectionName != string.Empty)
                        {
                            OutputDebug("End of section \"" + sectionName + "\" found");
                            OutputDebug(linesInSection.Count() + " lines found total in " + sectionName + "\" during section search");
                            try
                            {
                                sections.Add(sectionName, linesInSection);
                            }
                            catch (Exception)
                            {
                                OutputError("Two/Multiple sections with the same names exist. Ignoring the latest section with the same name");
                            }
                            linesInSection = new List<string>();
                            sectionName = string.Empty;
                            isOnSameLineAsSectionStart = true;
                        }
                    }
                    if (!isOnSameLineAsSectionStart && sectionName != string.Empty)
                    {
                        linesInSection.Add(line);
                    }
                    if (isOnSameLineAsSectionStart && sectionName != string.Empty)
                    {
                        OutputDebug("Start of section \"" + sectionName + "\" found");
                    }
                    if (isOnSameLineAsSectionStart == true)
                    {
                        isOnSameLineAsSectionStart = false;
                    }
                }
                lineReader.Close();
                OutputDebug("In StringReader!" + i);
            }

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

вы можете использовать при подходе ниже:

while ((line = reader.ReadLine()) != null)
{
    foreach (char Character in line)
    {
        i++;
        OutputDebug(i.ToString());
    }
}
0 голосов
/ 14 декабря 2018

Так как мы ограничены этим фрагментом, мы можем делать только предположения.

lineReader.ReadLine();

, если это блокирующий вызов, то код может никогда не завершиться, если нет вводадано.

если это разблокирующий вызов, это означает, что он возвращает что-то, даже если ввод не предоставлен.Если возвращаемое значение является пустой строкой в ​​этом случае, то вы находитесь в бесконечном цикле.

Я считаю, что ключевая функция здесь ReadLine.

0 голосов
/ 14 декабря 2018

Хорошо, если вы хотите выводить все символы построчно.Вы можете разбить их на массив строк:

var lines = Regex.Split(input, "\r\n|\r|\n"), извлеченный из здесь .

Позже, используя foreach вместо статики while, вы должны решить проблему:

foreach(string line in lines)

Также сравнение строки с нулевым значением ... Не выглядит так хорошо.Почему бы не использовать (встроенный) метод string.IsNullOrEmpty(line), чтобы проверить, является ли текущая строка нулевой?

Если вы хотите использовать свой подход, вы должны сделать что-то вроде этого:

while (!string.IsNullOrEmpty(line = reader.ReadLine()))
{
    // Your code...
}

Надеюсь, это поможет!

...