2016-03-23 5 views
0

Мне нужно прочитать целые числа от консоли, набирая белые символы до конца файла, но я не знаю, как, я ищу ответ, но я не мог его найти.Console.Read() до eof

while((x = Console.Read()) != null) 

ответ

1

int значения не могут быть опущены. Вы должны использовать отрицательный.

while((x = Console.Read()) != -1) 
+0

Вы можете технически использовать 'int?', Который является нулевым. – Greg

+1

, но затем он не читается до тех пор, пока eof не достигнет нуля –

+0

@Greg 'Console.Read()' возвращает 'int' @KingstonJoshua исправлено. возвращаемое значение -1 не равно –

2

Обратите внимание, что метод не возвращает -1, если вы не выполните одно из следующих действий:

  • Одновременно нажмите клавишу модификатор управления и Z консоли клавиши (Ctrl + Z), который сигнализирует о состоянии конца файла.
  • Нажмите эквивалентный ключ, который сигнализирует состояние конца файла, например, функциональную клавишу F6 в Windows.
  • Перенаправить поток ввода в источник, например текстовый файл с фактическим символом конца файла.

MSDN Read() method.

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

static void Main(string[] args) 
{ 
    foreach (int i in Read(Console.In)) 
    { 
     Console.WriteLine(i); 
    } 
} 

static IEnumerable<int> Read(TextReader rdr) 
{ 
    int ch; 
    bool neg = false; 
    int value = 0; 
    int count = 0; 

    while ((ch = rdr.Read()) != -1) 
    { 
     if (char.IsWhiteSpace(ch)) 
     { 
      if (count > 0) 
       yield return neg ? -value : value; 
      count = 0; 
      value = 0; 
      neg = false; 
     } 
     else if (count == 0 && ch == '-') 
     { 
      neg = true; 
     } 
     else if (ch >= '0' && ch <= '9') 
     { 
      count++; 
      value = value*10 + (ch - '0'); 
     } 
     else 
      throw new InvalidDataException(); 
    } 

    if (count > 0) 
     yield return neg ? -value : value; 
} 
+1

Я думаю, это немного перебор, LOL. – Andrew

+0

@ Хорошо, что это хорошо, потому что с помощью TextReader можно инициализировать файл и консоль. Он ленив и не имеет накладных расходов, как метод Split. Кроме того, я не совсем понимаю исходный вопрос, тогда я попытался добавить полный ответ. –