如何在C#中从控制台读取很长的输入?

时间:2012-03-17 14:41:48

标签: c# console windows-console

我需要在C#中从控制台加载veeeery long line,最多65000个字符。 Console.ReadLine本身的限制为254个字符(转义序列为+2),但我可以使用它:

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) - 不幸的是我需要输入WAY更大的行,当READLINE_BUFFER_SIZE设置为大于8192的任何值时,错误“存储空间不足可用于处理此命令“显示在VS.缓冲区应该设置为65536.我已经尝试了几个解决方案来做到这一点,但我还在学习并且没有超过1022或8190个字符,我怎么能将该限制增加到65536?提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用StringBuilder尝试Console.Read

        StringBuilder sb =new StringBuilder();
        while (true) {
            char ch = Convert.ToChar(Console.Read());
            sb.Append(ch);
            if (ch=='\n') {
                break;
            }
        }

答案 1 :(得分:1)

您必须在main()方法中添加以下代码行:

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

然后你可以使用Console.ReadLine();阅读长用户输入。

答案 2 :(得分:0)

我同意Manmay,这似乎对我有用,并且我还尝试保留默认的stdin,以便以后可以恢复它:

        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);
        }