2010-02-23 7 views
4

Y at-il une bibliothèque C# qui fournit la fonctionnalité de ">>" et "< <" pour IO en C++? C'était vraiment pratique pour les applications console. Certes, pas beaucoup d'applications de console sont en C#, mais certains d'entre nous l'utilisent pour eux.C++ ">>" et "<<" IO en C#?

Je sais que Console.Read [Line] | Write [Line] et Streams | FileStream | StreamReader | StreamWriter ne fait pas partie de la question.

Je ne pense pas assez im spécifique

int a,b; 
cin >> a >> b; 

est incroyable !!

string input = Console.ReadLine(); 
string[] data = input.split(' '); 
a = Convert.ToInt32(data[0]); 
b = Convert.ToInt32(data[1]); 

... assez long? De plus, il existe d'autres raisons pour lesquelles la solution C# est pire. Je dois obtenir la ligne entière ou faire mon propre tampon pour cela. Si la ligne sur laquelle je travaille est IDK, disons la ligne 1000 de Bells Triangle, je perds tellement de temps à tout lire en même temps.

EDIT: GAR !!!

OK LE PROBLÈME !!! Utilisation IntX pour faire un nombre énorme comme le .Net 4.0 BigInteger pour produire le triangle de la cloche

Si vous connaissez le triangle de la cloche, il devient énorme très très rapidement. Le but de cette question est que j'ai besoin de traiter chaque numéro individuellement. Si vous lisez une ligne entière, vous pouvez facilement cliquer sur Gigs of data. C'est un peu la même chose que les chiffres de Pi. Par exemple 42pow1048576 est 1,6 Mo! Je n'ai pas le temps ni la mémoire de lire tous les nombres comme une chaîne puis de choisir celui que je veux

+0

Je ne vois pas quel est le problème. L'approche de C# est peut-être plus verbeuse, mais elle est beaucoup plus raisonnable, elle permet un contrôle beaucoup plus précis sur ce que vous faites, et facilite beaucoup le traitement des erreurs *. De plus, ce n'est pas une utilisation abusive d'un opérateur (le fait de passer outre un opérateur juste pour rendre les opérations d'E/S un peu plus faciles à taper est faux). –

+0

Eh bien, vous pourriez commencer par fusionner les deux premières lignes: var data = Console.ReadLine(). Split (''); Ensuite, vous pouvez probablement ajouter ConvertAll() sur cela pour obtenir ints, mais je ne connais pas assez la syntaxe pour oser l'écrire ici. –

+0

@Will Vousden: "C# offre un contrôle plus fin sur ce que vous faites"? Hum, je ne suis pas d'accord avec ça .. –

Répondre

1

Je pense avoir ce que vous cherchez: une entrée formatée par défaut simple. Je pense que la raison pour laquelle il n'y a pas TextReader.ReadXXX() est que ce analyse syntaxique, et l'analyse syntaxique est dur: par exemple: doit ReadFloat():

  • ignorer les espaces au
  • exigent la virgule
  • nécessitent les espaces de fin (123abc)
  • exponentielles poignée (12.3a3 parse différemment à 12.4e5?)

Sans parler de ce que fait ReadString()? A partir de C++, vous vous attendez à "lire dans l'espace suivant", mais le nom ne le dit pas. Maintenant, tout cela a de bonnes réponses, et je suis d'accord que C# (ou plutôt, le BCL) devrait les fournir, mais je peux certainement comprendre pourquoi ils choisiraient de ne pas fournir des fonctions fragiles, presque impossibles à utiliser correctement. là sur une classe centrale.

EDIT: Pour le problème de la mise en mémoire tampon, une solution est laide:

static class TextReaderEx { 
    static public string ReadWord(this TextReader reader) { 
     int c; 
     // Skip leading whitespace 
     while (-1 != (c = reader.Peek()) && char.IsWhiteSpace((char)c)) reader.Read(); 
     // Read to next whitespace 
     var result = new StringBuilder(); 
     while (-1 != (c = reader.Peek()) && !char.IsWhiteSpace((char)c)) { 
      reader.Read(); 
      result.Append((char)c); 
     } 
     return result.ToString(); 
    } 
} 

... 
    int.Parse(Console.In.ReadWord()) 
+0

Eh bien, On dirait que je dois le faire>.> Soupir ... Merci pour l'explication comme pourquoi ils didn' probablement pas t. – Buttink

+0

@Buttink: Jetez un oeil à http: //www.complore.com/input-and-output-c formaté-entrée - ressemble à un bon point de départ. –

1

Non. Vous êtes coincé avec Console.WriteLine. Vous pourriez cependant créer un wrapper offrant cette fonctionnalité.

+0

Eh bien, Console.Out est un flux;) – user76035

+0

En fait, vous * ne pouvez pas * créer un tel wrapper ... Je viens d'essayer: en remplaçant les opérateurs << and >>, le deuxième paramètre doit être un int: S –

+1

@wwosik : non ce n'est pas ... c'est un TextWriter –

1

Vous pouvez utiliser Console.WriteLine, Console.ReadLine ..Pour le but.Les deux sont dans System NameSpace.

1

Vous avez System.IO.Stream (lecteur | Writer) Et pour la console: Console.Write, Console.Read

4

Non, et je ne. C# != C++

Vous devriez essayer de votre mieux pour coller avec la convention de langue de la langue que vous travaillez.

+0

Pour être juste, Console.WriteLine n'est rien d'autre que d'écrire dans le flux Console.Out. – user76035

+0

Maintenant, voyez c'est un endroit où je pense que C# EPIC échoue! C# IO facilite la lecture des valeurs binaires, difficile à lire. – Buttink

+0

@Buttink: Je ne suis pas sûr de ce que vous entendez par "difficile à lire le vrai texte". Console.Read/Write est textuel, puisque 'Console.Out' et' Console.In' sont des TextReader/Writers. Voulez-vous dire qu'il est difficile de lire un int textuel ou un mot? –

0

C'est même pas possible en C#, peu importe comment vous essayez dur:

  1. Le côté gauche et à droite des opérateurs est toujours passés par valeur; cela exclut la possibilité de cin.
  2. Le côté droit de << et >>must est un nombre entier; cela exclut cout.

Le premier point est de se assurer la surcharge des opérateurs est un peu moins salissant que dans C++ (discutable, mais il fait sûrement les choses beaucoup plus simples), et le deuxième point a été choisi spécifiquement pour écarter de C++ cin et cout façon de traiter avec IO, IIRC.

Questions connexes