Console.ReadLine () максимальная длина?
При запуске небольшого fragmentа кода C #, когда я пытаюсь ввести длинную строку в Console.ReadLine()
она кажется отрезанной после нескольких строк.
Максимальная длина до Console.Readline (), если есть способ увеличить это?
- Почему должен использоваться идиома «PIMPL»?
- Файл конфигурации C # DLL
- генерировать Zip-файл из azure blob-файлов
- Сериализация и десериализация деревьев выражений в C #
- Каков наилучший способ передать событие в ViewModel?
- В Visual Studio нет cl.exe
- Редактировать определенный элемент в XDocument
- В чем смысл термина «свободная функция» в C ++?
- Когда передавать по ссылке и когда проходить по указателю в C ++?
- Как работают манипуляторы streamа?
- ObservableCollection Не поддерживает метод AddRange, поэтому я получаю уведомление для каждого добавленного элемента, кроме того, что касается INotifyCollectionChanging?
- Как гауссовское размытие изображения без использования встроенных функций gaussian?
- Не удается найти пространство имен 'System.Data.SqlServerCe'
без каких-либо изменений в коде, я считаю, что он будет принимать только 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); }
Проблема с ответом 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();
Это упрощенная версия ответа ара, и это работает для меня.
int bufSize = 1024; Stream inStream = Console.OpenStandardInput(bufSize); Console.SetIn(new StreamReader(inStream, Console.InputEncoding, false, bufSize)); string line = Console.ReadLine();
Это упрощенная версия ответа Петра Матаса . В основном вы можете указать размер буфера только один раз:
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 !
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; }
Это, по-видимому, является ограничением для консоли Windows. Вы должны попробовать ввести свой файл в файл, а затем передать файл в приложение. Я не уверен, что это сработает, но у него есть шанс.
regex_text.exe < my_test_data.txt
В зависимости от вашей ОС вход в командную строку будет принимать только 8191 символ для XP и 2047 символов для NT и Windows 2000. Я предлагаю вам вместо этого передать имя файла, у которого есть длинный ввод и чтение этого файла.
Если вам нужно увидеть весь вывод текста в консоли, я обнаружил, что для его отображения работает следующий код:
Console.SetBufferSize(128, 1024);
Сохраните ввод текста и используйте 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); } }