Console.ReadLine() максимальная длина?
При запуске маленькой части кода С#, когда я пытаюсь ввести длинную строку в Console.ReadLine()
, она кажется отрезанной после нескольких строк.
Есть ли максимальная длина для Console.Readline(), если есть способ увеличить это?
![enter image description here]()
Ответы
Ответ 1
без каких-либо изменений в коде, я считаю, что он будет принимать только 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
Проблема с ответом stack72 заключается в том, что если код используется в пакете script, вход больше не буферизирован. Я нашел альтернативную версию в 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();
Ответ 3
Это упрощенная версия ara answer, и она работает для меня.
int bufSize = 1024;
Stream inStream = Console.OpenStandardInput(bufSize);
Console.SetIn(new StreamReader(inStream, Console.InputEncoding, false, bufSize));
string line = Console.ReadLine();
Ответ 4
Это упрощенная версия ответ Петра Матаса.
В основном вы можете указать размер буфера только один раз:
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!
Ответ 5
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
Это, по-видимому, ограничение консоли Windows. Вы должны попробовать ввести свой файл в файл, а затем передать файл в приложение. Я не уверен, что это сработает, но у него есть шанс.
regex_text.exe < my_test_data.txt
Ответ 7
В зависимости от вашей ОС вход в командную строку будет принимать только 8191 символов для XP и 2047 символов для NT и Windows 2000. Я предлагаю вам вместо этого передать имя файла, у которого есть длинный ввод и прочитать этот файл.
Ответ 8
Если вам нужно увидеть весь вывод текста в консоли, я обнаружил, что для его отображения работает следующий код:
Console.SetBufferSize(128, 1024);
Ответ 9
Сохраните ввод текста и используйте 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);
}
}