2013-10-11 3 views
0

Dans mon programme, je travaille avec un flux d'entrée et un flux de sortie. Ceux-ci peuvent être n'importe quel type de flux, mais dans la plupart des cas, ils sont simplement l'entrée et la sortie standard dans la console. Voici comment les flux sont initialisés:C#: Détacher l'entrée de la console de la sortie de la console

StreamReader input = null; 
StreamWriter output = null; 
/* ... */ 
if (output == null) 
{ 
    output = new StreamWriter(Console.OpenStandardOutput()); 
} 
if (input == null) 
{ 
    input = new StreamReader(Console.OpenStandardInput()); 
} 

Mon problème est que l'entrée de la console est toujours sur la console. J'ai des caractères spéciaux que je ne veux pas écrire sur la console. Pour être plus précis, je veux utiliser l'onglet pour compléter automatiquement par exemple.

Lorsque vous recherchiez la seule solution que j'ai trouvé était d'utiliser Console.ReadKey(). Cependant, cela ruinerait mon soutien aux flux en général, puisque les flux n'ont pas une méthode similaire.

Ma question est: Est-il possible de détacher le flux d'entrée du flux de sortie? Des moyens alternatifs pour résoudre ce problème sont également les bienvenus.

Répondre

1

La classe Console est une bête étrange. Vous allez avoir besoin de Console.ReadKey() pour faire ce que vous voulez. Un problème est que sans cela vous n'obtiendrez aucune entrée de votre flux jusqu'à ce que les utilisateurs appuient sur la touche Entrée. Voici un exemple très simple:

 char inp; 
     do { 
      var x = Console.ReadKey(true); 
      inp = x.KeyChar; 
      output.Write(inp); 
      if (x.Key == ConsoleKey.Enter) { Console.WriteLine(); } 
      } while (inp != 'x'); 

Si vous voulez coller avec un modèle de flux que vous pouvez faire quelque chose comme ceci:

public class ConsoleStream: StreamReader { 
     public ConsoleStream(): base(new MemoryStream()) {} 
     public override int Read() { 
      var key = Console.ReadKey(true); 
      return (int) key.KeyChar; 
      } 
     } 

MemoryStream ci-dessus ne sert pas, juste là pour permettre à la base StreamReader à construire. Vous utilisez la classe comme ceci:

 var cin = new ConsoleStream(); 
     char inp; 
     do { 
      inp = (char) cin.Read(); 
      Console.Write(inp); 
      if (inp == '\r') { Console.WriteLine(); } 
      } while (inp != 'x'); 

Si c'était moi, j'utiliserais ReadKey directement.

Questions connexes