C ++ «>>» и «<<» IO в C #? - PullRequest
       53

C ++ «>>» и «<<» IO в C #?

4 голосов
/ 24 февраля 2010

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

Я знаю о 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 # хуже.Я должен получить всю строку или создать свой собственный буфер для нее.Если линия, над которой я работаю, - это ИДК, скажем, линия «Треугольник колоколов» 1000, я трачу столько времени на чтение всего за один раз.

РЕДАКТИРОВАТЬ: ГАР !!!

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

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

Ответы [ 7 ]

4 голосов
/ 24 февраля 2010

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

Вы должны стараться придерживаться языкового соглашения на любом языке, на котором вы работаете.

1 голос
/ 24 февраля 2010

Я думаю, что получаю то, что вы ищете: простой форматированный ввод по умолчанию. Я думаю, что причина отсутствия 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())
1 голос
/ 24 февраля 2010

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

1 голос
/ 24 февраля 2010

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

1 голос
/ 24 февраля 2010

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

0 голосов
/ 24 февраля 2010

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

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

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

0 голосов
/ 24 февраля 2010

Не то, что я знаю. Если вас интересуют цепочечные выходы, вы можете использовать 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 ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...