Согласно документации MSDN, в Console.Read
метод возвращает:
Следующий персонаж входной поток или отрицательный (-1), если в настоящее время больше нет символов для чтения.
Таким образом, на самом деле то, что вы видите, это только первый символ в настоящее время на потоке (т.е. полученных символов между двумя последними Enter толчков).
Во время тестирования устройства казалось, что значения были сдвинуты на 48, потому что так получилось, что значения ASCII для символов от «0» до «9», как вы уже догадались, 48 для «0», , 49 для «1», и т.д.:
поскольку вы не указали преобразование, содержание потока было «автомагический» читаются как char
значений, и ваш вызов Read()
отображается их ASCII десятичных эквивалентов.
Вы можете проверить это с помощью этого простого теста:
static void TestRead()
{
int current = 0;
Console.Write("Enter 1: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
Console.Write("Enter 22: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
Который приведет:
Вы заметите, что спина к спине вызовы на Read()
захватить одного символа из потока и дать вам его ASCII десятичный эквивалент. Также обратите внимание на то, как Windows добавляет последовательность возврата каретки (ASCII 13) и строки (ASCII 10) для каждого такта . Введите ключ, который ваша программа добросовестно повторяет вам.
Незначительная модификация данного метода позволило бы вести точку, что при отсутствии конкретных направлений, среда выполнения будет интерпретировать содержимое входного потока в виде символов:
static void TestReadModified()
{
int current = 0;
Console.Write("Enter a: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
Как и ожидалось, метод выше будет возвращать значение ASCII для символа 'A':
Как уже уже упоминалось, это легко исправить. Просто сообщите во время выполнения, что вы хотите, чтобы значение было интерпретировано как int
. Вероятно, это также хорошая идея, по крайней мере, проверить, что введенный вход - это номер:
static void readPerson(out string name, out int age)
{
Console.Write("Enter name: ");
name = Console.ReadLine();
Console.Write("Enter age: ");
// in this case, we could simply use tempAge (defaults to 0)
// but it's just practice to check TryParse's success flag
int tempAge;
var success = Int32.TryParse(Console.ReadLine(), out tempAge);
age = success ? tempAge : 0;
Console.WriteLine("Name: {0}; Age: {1}", name, age);
Console.ReadLine();
}
отличный ответ - я не могу представить, чтобы это было понятно. Интересно, как Read() «хранит» и выбрасывает отдельный символ в последовательности. Он также может быть перезаписан, если есть новый вход. Есть какой-то буферный механизм? Можете ли вы направить меня куда-нибудь для дальнейшего чтения? Я знаю, что это бесполезно, но мне любопытно. – KMC
Существует много информации вокруг. Вот несколько быстро схваченных статей: http://stackoverflow.com/questions/1216380/what-is-a-stream и http://msdn.microsoft.com/en-us/library/system.io.stream .aspx –