5

我需要在 C# 中从控制台加载非常长的行,最多 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) - 不幸的是,我需要输入更大的行,当 READLINE_BUFFER_SIZE 设置为大于 8192 时,错误“没有足够的存储空间可供处理此命令”显示在 VS 中。缓冲区应设置为 65536。我已经尝试了几种解决方案来做到这一点,但我仍在学习,没有一个超过 1022 或 8190 个字符,我怎样才能将该限制增加到 65536?提前致谢。

4

3 回答 3

3

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

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

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

于 2016-08-25T08:22:43.240 回答
2

尝试使用 StringBuilder 的 Console.Read

        StringBuilder sb =new StringBuilder();
        while (true) {
            char ch = Convert.ToChar(Console.Read());
            sb.Append(ch);
            if (ch=='\n') {
                break;
            }
        }
于 2012-03-17T15:06:08.140 回答
0

我同意 Manmay 的观点,这似乎对我有用,而且我还尝试保留默认的标准输入,以便之后可以恢复它:

        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);
        }
于 2019-03-06T15:00:40.970 回答