【问题标题】:Console.ReadLine() max length?Console.ReadLine() 最大长度?
【发布时间】:2011-04-05 20:12:42
【问题描述】:

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

Console.Readline() 是否有最大长度,如果有,有没有办法增加它?

【问题讨论】:

  • “几行之后”? ReadLine() 应该只返回 1 行! ;D
  • @Jeffrey:抱歉,我的意思是在正常的 cmd.exe 控制台大小中,它有几行环绕:-)
  • @Jeffrey:添加了图片来显示你想要的我的意思是,它不会让我在屏幕截图中看到更多的“a”字符。
  • /* Console.ReadLine() 最大值为 254*/ Console.WriteLine("Length = " + Console.ReadLine().Length); // StreamReader 可以读取更多内容。一次可以读几千个字符

标签: c#


【解决方案1】:

这是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

【讨论】:

    【解决方案2】:

    无需对代码进行任何修改,最多只需要 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);
        }
    

    【讨论】:

    • 不错的解决方案。对于替代方案,请参阅this later answer 以查看此处关于 SO 的问题的副本。它使用Console.SetIn 更改“in”流。
    • 当我尝试用 base64 编码的字符串来做这件事时,其中一些变成了汉字,去找 ara 的答案
    【解决方案3】:

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

    我找到了下面的单个行代码here。这似乎成功了。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 没有文字。我爱你。
      • 绝对没有理由仅仅为了使用 .Length 属性而创建一个数组 (inputBuffer)。 Petr Matas 的答案完全相同,只是它没有使用令人困惑/未使用的数组。
      • 如何获得高于 1024 的字符数?我尝试过更高的数字,但 1024 似乎总是限制。
      【解决方案5】:

      这是ara's answer 的简化版本,它适用于我。

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

      【讨论】:

        【解决方案6】:

        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 限制?
        【解决方案7】:

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

        regex_text.exe < my_test_data.txt
        

        【讨论】:

        • '不支持重定向'
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          Console.SetBufferSize(128, 1024);
          

          【讨论】:

          • 确保在方法块中使用它。
          【解决方案10】:

          将输入保存为文本并使用 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);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-18
            • 2010-09-15
            • 2014-10-03
            • 2011-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-17
            相关资源
            最近更新 更多