Console.ReadLine()的最大长度是多少?

52
当运行一小段C#代码时,当我尝试将长字符串输入到Console.ReadLine()中时,它似乎在几行后被截断了。 Console.Readline()有最大长度限制吗?如果有,是否有增加长度的方法? enter image description here

4
“after a couple of lines”? ReadLine() 应该只返回1行!;D - Jeffrey L Whitledge
@Jeffrey:抱歉,我的意思是在普通的cmd.exe控制台大小下,它只有几行并且会自动换行 :-) - Kyle Brandt
1
@Jeffrey:我添加了一张图片来展示我的意思,它不允许我输入比屏幕截图中看到的更多的“a”字符。 - Kyle Brandt
/* Console.ReadLine() 最大长度为254 */ Console.WriteLine("长度 = " + Console.ReadLine().Length); // StreamReader 可以读取更多内容。它可以一次性读取数千个字符 - user3108703
10个回答

35

stack72的答案存在一个问题,如果该代码在批处理脚本中使用,输入就不再是按行缓冲的了。我在averagecoder.net上找到了一种替代版本,它保留了ReadLine调用。请注意,StreamReader也必须有一个长度参数,因为它也有一个固定的缓冲区。

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

1
没有言语。我爱你。 - joelc
2
完全没有必要创建一个数组(inputBuffer)只是为了使用.Length属性。 Petr Matas的答案完全相同,只是它不使用混淆/未使用的数组。 - Wouter
你怎么才能得到一个大于1024的字符计数呢?我尝试过更高的数字,但1024似乎总是限制。 - trigger_segfault

34

在不对代码进行任何修改的情况下,它最多只能接受256个字符,即允许输入254个字符并保留2个字符用于CR和LF。

以下方法可以帮助增加限制:

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

2
不错的解决方案。如果需要另一种选择,请参见此处在SO上的问题的重复这个后来的答案。它使用Console.SetIn来更改“in”流。 - Jeppe Stig Nielsen
当我尝试使用Base64编码字符串进行此操作时,其中一些内容变成了中文字符,所以我选择了ara的答案。 - Max Carroll

23

这是 ara的回答 的简化版本,对我很有用。

int bufSize = 1024;
Stream inStream = Console.OpenStandardInput(bufSize);
Console.SetIn(new StreamReader(inStream, Console.InputEncoding, false, bufSize));

string line = Console.ReadLine();

23

这是Petr Matas的答案的简化版本。基本上,您只需按如下方式指定缓冲区大小一次即可:

Console.SetIn(new StreamReader(Console.OpenStandardInput(),
                               Console.InputEncoding,
                               false,
                               bufferSize: 1024));
string line = Console.ReadLine();

因为最终

Console.OpenStandardInput(int bufferSize)

通话记录

private static Stream GetStandardFile(int stdHandleName, FileAccess access, int bufferSize)

不使用bufferSize的方法!


9

Console.ReadLine()的字符限制是254个字符。

我在这里发现了下面这行代码,它似乎解决了问题。

Console.SetIn(new StreamReader(Console.OpenStandardInput(8192)));


1

ReadLine()在内部逐个字符地读取,直到遇到-1或'\n'或'\r\n'为止。

    public virtual String ReadLine()
    { 
        StringBuilder sb = new StringBuilder();
        while (true) { 
            int ch = Read(); 
            if (ch == -1) break;
            if (ch == '\r' || ch == '\n') 
            {
                if (ch == '\r' && Peek() == '\n') Read();
                return sb.ToString();
            } 
            sb.Append((char)ch);
        } 
        if (sb.Length > 0) return sb.ToString(); 
        return null;
    } 

也许我遇到了cmd.exe的限制? - Kyle Brandt

0
如果要在控制台中查看整个文本输出,我发现以下代码可以显示它:
Console.SetBufferSize(128, 1024);

请确保您在方法块内使用它。 - cartheur

0

这似乎是Windows控制台的限制。您应该尝试将输入放入文件中,然后将文件导入应用程序。我不确定那样是否有效,但有一定的机会。

regex_text.exe < my_test_data.txt

重定向不受支持。 - Kyle Brandt

0

根据您的操作系统,命令行输入对于XP只接受8191个字符,而对于NT和Windows 2000则只接受2047个字符。我建议您使用文件名传递长输入并读取该文件。


-1

将输入保存为文本并使用StreamReader。

using System;

using System.IO;

static void Main(string[] args)
{

    try
    {
        StreamReader sr = new StreamReader("C:\\Test\\temp.txt");
        Console.WriteLine(sr.ReadLine().Length);
    }
    catch (Exception e)
    {
         Console.WriteLine(e.StackTrace);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接