Console.ReadLine()最大长度?

时间:2011-04-05 20:12:43

标签: c#

当运行一小段C#代码时,当我尝试将长字符串输入Console.ReadLine()时,它似乎会在几行后切断。

Console.Readline()是否有最大长度,如果有,有办法增加吗? enter image description here

10 个答案:

答案 0 :(得分:29)

不对代码进行任何修改,最多只需要256个字符,即;它将允许输入254并为CR和LF保留2。

以下方法有助于增加限制:

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

答案 1 :(得分:29)

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

答案 2 :(得分:17)

这是ara's answer的简化版本,对我有用。

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

string line = Console.ReadLine();

答案 3 :(得分:12)

这是Petr Matas' answer的简化版本。 基本上,您只能指定一次缓冲区大小,如下所示:

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

答案 4 :(得分:4)

Console.ReadLine()的字符数限制为254。

我发现下面的代码here行。这似乎可以解决问题。

  

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

答案 5 :(得分: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;
    } 

答案 6 :(得分:0)

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

regex_text.exe < my_test_data.txt

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果是在控制台中查看文本的整个输出,我发现以下代码可以显示它:

Console.SetBufferSize(128, 1024);

答案 9 :(得分:-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);
    }
}