2010-02-23 4 views
4

Есть ли библиотека C#, которая обеспечивает функциональность «>>» и «< <» для ввода-вывода в C++? Это было действительно удобно для консольных приложений. Конечно, в C# не много консольных приложений, но некоторые из них используют их для них.C++ ">>" и "<<" IO в C#?

Я знаю о Console.Read [Line] | Write [Line] и Streams | FileStream | StreamReader | StreamWriter, который не является частью вопроса.

Я не думаю, что им достаточно конкретны

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

удивительна !!

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

... длинный намотчик достаточно? Кроме того, есть другие причины, по которым решение C# хуже. Я должен получить всю строку или сделать свой собственный буфер для этого. Если линия im работает, IDK говорит 1000 строк Bells Triangle, я трачу столько времени на чтение всего за один раз.

EDIT: GAR !!!

ОК ПРОБЛЕМА !!!

Использование IntX для создания огромного номера, такого как .net 4.0 BigInteger для создания треугольника звонка. Если вы знаете треугольник звонка, он очень быстро становится огромным. Весь смысл этого вопроса в том, что мне нужно иметь дело с каждым номером индивидуально. Если вы читаете целую строку, вы можете легко попасть в Gigs of data. Это похоже на цифры Pi. Для примера 42pow1048576 - 1,6 МБ! У меня нет времени или памяти, чтобы читать все цифры в виде одной строки, а затем выбрать тот, который я хочу

+0

Я не вижу, в чем проблема. Подход C# может быть более подробным, но это намного более разумно, позволяет намного лучше контролировать то, что вы делаете, и облегчает обработку ошибок *. Кроме того, это не оскорбительное использование оператора (переопределение оператора только для того, чтобы операции ввода-вывода немного легче вводить неправильно). –

+0

Ну, вы можете начать с слияния первых двух строк: var data = Console.ReadLine(). Split (''); Тогда вы можете добавить ConvertAll(), чтобы получить ints, но я не знаю, синтаксис weel достаточно, чтобы осмелиться написать его здесь. –

+0

@Will Vousden: «C# предлагает намного более тонкий контроль над тем, что вы делаете»? Хм, я не согласен с этим. –

ответ

1

Я думаю, что получаю то, что вам нужно: простой, по умолчанию форматированный ввод. Я думаю, что причина нет TextReader.ReadXXX() является то, что это разбор и разбор трудно: например: должен ReadFloat():

  • игнорировать ведущие пробелы
  • требуют десятичной точки
  • требует конечных пробелов (123abc)
  • ручка экспонента (12.3a3 разбирает по-разному к 12.4e5?)

Не говоря уже о том, что делает ReadString()? Из C++ вы ожидаете, что «прочитайте в следующем пробеле», но имя не говорит об этом.

Теперь все они имеют хорошие разумные ответы, и я согласен, что C# (или, скорее, BCL) должен предоставить их, но я могу, конечно, понять, почему они предпочтут не предоставлять хрупкие, почти невозможно использовать правильно, там на центральном классе.

EDIT: Для задачи буферным, уродливое решение:

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

Ну, похоже, я должен сделать это>.> Вздох ... Спасибо за объяснение, почему они, вероятно, т. – Buttink

+0

@Buttink: Взгляните на http: //www.complore.com/input-and-output-c-format-input - выглядит хорошей отправной точкой. –

1

Нет. Вы застряли с Console.WriteLine. Однако вы можете создать оболочку, которая предложила эту функциональность.

+0

Ну, Console.Out - это поток;) – user76035

+0

На самом деле вы * не могли * создать такую ​​оболочку ... Я просто попытался: при переопределении операторов << and >> вторым параметром должен быть int: S –

+1

@wwosik : no it is not ... это TextWriter –

1

Вы можете использовать Console.WriteLine, Console.ReadLine .. Для цели. Оба находятся в System NameSpace.

1

Вы System.IO.Stream (Читатель | Writer) И для консоли: Console.Write, Console.Read

4

Нет, и я бы не стал. C# != C++

Вы должны стараться изо всех сил, чтобы придерживаться языка конвенции независимо от языка вы работаете.

+0

Чтобы быть справедливым, Console.WriteLine - это не что иное, как запись в поток Console.Out. – user76035

+0

Теперь посмотрим, что это одно место, я думаю, C# EPIC FAILS! C# IO упрощает чтение двоичных значений прямолинейно, как бы трудно читать реальный текст. – Buttink

+0

@Buttink: Я не уверен, что вы подразумеваете под «трудно читать реальный текст». Console.Read/Write является текстовым, так как 'Console.Out' и' Console.In' являются TextReader/Writers. Вы имеете в виду, что трудно прочитать текстовое слово int или word? –

0

Не то, что я знаю. Если вас интересуют выходы цепочки, вы можете использовать System.Text.StringBuilder. http://msdn.microsoft.com/en-us/library/system.text.stringbuilder(VS.71).aspx

StringBuilder builder = new StringBuilder(); 
builder.Append("hello").Append(" world!"); 
Console.WriteLine(builder.ToString()); 

Возможно, не так хороша, как C++, но еще стендовых состояний, C#! = C++.

0

Это не возможно даже в C#, как ни старайся:

  1. Левая и правая часть операторов всегда передается по значению; это исключает возможность использования cin.
  2. Правая часть << и >>must - целое число; это исключает cout.

Первый пункт, чтобы убедиться, что перегрузка оператора немного менее грязный, чем в C++ (спорно, но это, безусловно, делает вещи намного проще), а вторая точка была специально выбрана, чтобы исключить C++ 's cin и cout способ работы с IO, IIRC.

Смежные вопросы