2016-03-23 53 views

回答

1

int值不爲空。你必須使用負面的。

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

你可以在技術上使用'int?',它是可以爲空的。 – Greg

+1

但直到eof才被讀取爲零 –

+0

@Greg'Console.Read()'返回一個'int' @KingstonJoshua更正。返回的值是-1不是零 –

2

注意,該方法不返回-1,除非你執行 下列操作之一:

  • 同時按下Control修改鍵和Z鍵控制檯(按Ctrl + Z),這表示文件結束狀態。
  • 按下表示文件結束條件的等效鍵,例如Windows中的F6功能鍵。
  • 將輸入流重定向到具有實際文件結尾字符的源(例如文本文件)。

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

@Andrew它是通用的,因爲使用TextReader可以初始化文件和控制檯。這是懶惰的,沒有像Split方法那樣的開銷。此外,我不是真正瞭解源問題,然後我試圖添加完全答案。 –