Конец потока не обнаруживается читателем.EndOfStream

#c# #.net-core #streamreader

#c# #.net-ядро #streamreader

Вопрос:

Я читаю строки из командной строки. Но конец потока не может быть обнаружен моей программой. Как мне восстановить это или есть способ явно установить для EndOfStream значение true?

 List<String> str = new List<String>();

        using (StreamReader reader = new StreamReader(Console.OpenStandardInput()))

            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();

                if (line != string.Empty)
                {
                    str.Add(line);
                }
            }
  

Комментарии:

1. Почему вы ожидаете, что поток консоли завершится? Поток должен оставаться открытым до тех пор, пока программа не будет закрыта.

2. ReadLine() обычно возвращается null , если в любом случае достигнут конец потока, поэтому вам даже не нужно проверять EndOfStream . Однако в вашем случае это не сработает, потому что по замыслу консоль никогда не достигает своего конца. Вам нужно будет найти другой метод определения того, когда ввод данных завершен.

Ответ №1:

Это не может сработать по замыслу. Потоки консоли stdin / stdout открываются до тех пор, пока программа активна. В EndOfStream этом случае выполняется непосредственно перед закрытием приложения.

Хорошим решением для вашей проблемы является.

 using System;

public class Example
{
   public static void Main()
   {
      string line;
      do { 
         line = Console.ReadLine();
         if (line != null) 
            Console.WriteLine("Now I have detected the end of stream.... "   line);
      } while (line != null);   
   }
}
  

Ответ №2:

Ваш код в порядке. При чтении с консоли EOF указывается путем ввода: ^z затем ENTER .

Это стандарт, такой же старый, как DOS. В Unix есть аналогичный стандарт, но это ^d .

Билл Гейтс либо не знал Unix, либо решил быть другим, но не лучше. Вот почему это ^z, а не ^d

Аналогично, DOS и Windows обрабатывают «/» как разделитель параметров командной строки, хотя «/» и «» обрабатываются внутренними компонентами Windows как разделители путей.