Как прочитать очень длинный ввод из консоли в C #? - PullRequest
5 голосов
/ 17 марта 2012

Мне нужно загрузить очень длинную строку из консоли в C #, до 65000 символов.Сам Console.ReadLine имеет ограничение в 254 символа (+2 для escape-последовательностей), но я могу использовать это:

static string ReadLine()
{
    Stream inputStream = Console.OpenStandardInput(READLINE_BUFFER_SIZE);
    byte[] bytes = new byte[READLINE_BUFFER_SIZE];
    int outputLength = inputStream.Read(bytes, 0, READLINE_BUFFER_SIZE);
    Console.WriteLine(outputLength);
    char[] chars = Encoding.UTF7.GetChars(bytes, 0, outputLength);
    return new string(chars);
}

... для преодоления этого ограничения, до 8190 символов (+2 дляescape-последовательности) - к сожалению, мне нужно ввести WAY большую строку, и когда для READLINE_BUFFER_SIZE установлено значение больше 8192, в VS. появляется ошибка «Недостаточно памяти для обработки этой команды».Буфер должен быть установлен на 65536. Я попробовал пару решений для этого, но я все еще учусь, и ни одно из них не превысило 1022 или 8190 символов, как я могу увеличить этот предел до 65536?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 августа 2016

Вы должны добавить следующую строку кода в свой метод main():

byte[] inputBuffer = new byte[4096];
                Stream inputStream = Console.OpenStandardInput(inputBuffer.Length);
                Console.SetIn(new StreamReader(inputStream, Console.InputEncoding, false, inputBuffer.Length));

Тогда вы можете использовать Console.ReadLine (); читать длинный ввод пользователя.

1 голос
/ 17 марта 2012

попробуйте Console.Read с StringBuilder

        StringBuilder sb =new StringBuilder();
        while (true) {
            char ch = Convert.ToChar(Console.Read());
            sb.Append(ch);
            if (ch=='\n') {
                break;
            }
        }
0 голосов
/ 06 марта 2019

Я согласен с Мэнмэем, который, кажется, работает для меня, и я также пытаюсь сохранить стандартный ввод по умолчанию, чтобы потом восстановить его:

        if (dbModelStrPathname == @"con" ||
            dbModelStrPathname == @"con:")
        {
            var stdin = Console.In;

            var inputBuffer = new byte[262144];
            var inputStream = Console.OpenStandardInput(inputBuffer.Length);
            Console.SetIn(new StreamReader(inputStream, Console.InputEncoding, false, inputBuffer.Length));

            dbModelStr = Console.In.ReadLine();

            Console.SetIn(stdin);
        }
        else
        {
            dbModelStr = File.ReadAllText(dbModelStrPathname);
        }
...