当运行一小段C#代码时,当我尝试将长字符串输入到
Console.ReadLine()
中时,它似乎在几行后被截断了。
Console.Readline()
有最大长度限制吗?如果有,是否有增加长度的方法?
![enter image description here](https://istack.dev59.com/UxPOp.webp)
Console.ReadLine()
中时,它似乎在几行后被截断了。
Console.Readline()
有最大长度限制吗?如果有,是否有增加长度的方法?
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();
在不对代码进行任何修改的情况下,它最多只能接受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);
}
这是 ara的回答 的简化版本,对我很有用。
int bufSize = 1024;
Stream inStream = Console.OpenStandardInput(bufSize);
Console.SetIn(new StreamReader(inStream, Console.InputEncoding, false, bufSize));
string line = Console.ReadLine();
这是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的方法!
Console.ReadLine()
的字符限制是254个字符。
我在这里发现了下面这行单代码,它似乎解决了问题。
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192)));
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;
}
Console.SetBufferSize(128, 1024);
这似乎是Windows控制台的限制。您应该尝试将输入放入文件中,然后将文件导入应用程序。我不确定那样是否有效,但有一定的机会。
regex_text.exe < my_test_data.txt
根据您的操作系统,命令行输入对于XP只接受8191个字符,而对于NT和Windows 2000则只接受2047个字符。我建议您使用文件名传递长输入并读取该文件。
将输入保存为文本并使用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);
}
}