2016-03-23 8 views
0

ファイルの終わりまで白い文字でコンソールの整数を読み取る必要がありますが、どのように答えが見つかるのかわかりませんが、見つけられませんでした。eofまでのConsole.Read()

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

答えて

1

int値はNULL可能ではありません。あなたは否定的なものを使用しなければなりません。メソッドが返さないこと-1あなたは 次のいずれかの操作を実行しない限り、

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

技術的には、「int?」を使用できます。これはヌル入力可能です。 – Greg

+1

ですが、eofがゼロになるまで読み取られません。 –

+0

@Greg 'Console.Read()'が 'int'を返します。 @KingstonJoshuaが修正されました。返される値はゼロではありません。 –

2

注:

  • 同時にコントロール修飾キーと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メソッドのオーバーヘッドはありません。また、私は本当にソースの質問を理解していないし、完全に答えを追加しようとしました。 –