Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Почему так работает?


Автор: Ukrajinec 11.2.2016, 19:43
Доброго времени суток!
Идея такова, читается файл построчно, пока не кончится. Вот код который получил методом проб и ошибок. 
Код

while (reader.ReadLine() != null)
                {
                    if (reader.ReadLine() == null) break;
                    line = reader.ReadLine();                    
                    string str = FindXY(line).ToString();
                    richTextBox2.Text = str;
                    richTextBox2.Text = "\n";
                }

Теперь вопрос:
почему если убрать строчку
 
Код

...
 if (reader.ReadLine() == null) break;
...

или изменить условие цикла while
Код

while(true)
...

читается пустая строчка (null), а не прекращается цикл?

Автор: _zorn_ 12.2.2016, 03:59
С шарпом не знаком, но мне кажется что во время проверки читается строка. 
Т.е. по факту в строке line = reader.ReadLine(); читается уже третья строчка при первом проходе. На втором 6-я ну и т.д.

Надо использовать что то вроде while(!reader.endOfFile()).

ЗЫ. С таким подходом удивляюсь почему в конце цикла еще одну точно такую же проверку не добавили... на всякий случай  smile 

Автор: chupachups 12.2.2016, 09:58
потому что надо https://msdn.microsoft.com/ru-ru/library/system.io.textreader(v=vs.110).aspx читать и писать правильно:
Код

line = reader.ReadLine();                    
while (line != null)
{
    string str = FindXY(line).ToString();
    richTextBox2.Text = str;
    richTextBox2.Text = "\n";
    line = reader.ReadLine();                    
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pochemu-tak-rabotayet-id56bcba8eae2015d75d8b4567#findElement_E7045_56bd828fae201508556e4121_0

Автор: solowey 12.2.2016, 20:46
Не согласен с предыдущим оратором. В мсдн так написано:
Код

using (StreamReader sr = new StreamReader(path)) 
{
    while (sr.Peek() >= 0) 
    {
        Console.WriteLine(sr.ReadLine());
    }
}

Предыдущий вариант, так же можно использовать...
И скорее всего по коду идет тройное считывание:
1 раз - while (reader.ReadLine() != null)
2 раз - if (reader.ReadLine() == null) break;
3 раз - line = reader.ReadLine();
На мой взгляд, в richTextBox2 должны попадать не все строки.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pochemu-tak-rabotayet-id56bcba8eae2015d75d8b4567#findElement_E7045_56be1a92ae2015531f6e4083_0

Автор: chupachups 12.2.2016, 23:26
насчет записи в richTextBox2 согласен, туда я даже не смотрел. НО:
1) по условию задачи "читается файл построчно, пока не кончится" - ни через-строчно, ни через-два-три-и.т.д.-строчно
2) следует из первого, раз уж построчно, то зачем почем зря Peek-ать? ИМХО моё предложение более читаемо и интуитивно понятно нежели через Peek
3) вообще сам автор по сабжу сильно смахивает на студента 1 курса, посему не вижу особого смысла выяснять - как быстрее и красивее, ибо преподу нужно чтоб работало как задумано, и строки не терялись

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pochemu-tak-rabotayet-id56bcba8eae2015d75d8b4567#findElement_E7045_56be3fddae201523476e4154_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)