Буферизация консольного ввода (Код из Шилда)

Ответить
sasha-ua
Сообщения: 2
Зарегистрирован: 12 май 2015, 19:07

Буферизация консольного ввода (Код из Шилда)

Сообщение sasha-ua » 12 май 2015, 19:23

Здравствуйте.

Учу Java 7 по Шилду. Руководство для начинающих.
3 глава, 105 стр.
Вопрос по этому коду:

[syntax=java]// Guess the letter game, 4th version.
class Guess4 {
public static void main(String args[])
throws java.io.IOException {

char ch, ignore, answer = 'K';

do {
System.out.println("I'm thinking of a letter between A and Z.");
System.out.print("Can you guess it: ");

// read a character
ch = (char) System.in.read();

// discard any other characters in the input buffer
do {
ignore = (char) System.in.read();
} while(ignore != '\n');

if(ch == answer) System.out.println("** Right **");
else {
System.out.print("...Sorry, you're ");
if(ch < answer) System.out.println("too low");
else System.out.println("too high");
System.out.println("Try again!\n");
}
} while(answer != ch);
}
}[/syntax]

Не смотря на описание не пойму как это работает:

[syntax=java]
// discard any other characters in the input buffer
do {
ignore = (char) System.in.read();
} while(ignore != '\n');
[/syntax]

В приложении объяснение по книге:
Вложения
Untitled-2.jpg
Untitled-2.jpg (62.55 КБ) 2220 просмотров

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Буферизация консольного ввода (Код из Шилда)

Сообщение Donart » 12 май 2015, 21:10

\n - это символ перевода строки и возврата каретки (нажатие Enter).
Когда что-то вводишь в консоль и нажимаешь Enter, этот символ тоже считывается.
Выглядит примерно так:
Я\n
ищу\n
ответ\n
Этот вложенный цикл посимвольно продолжает бежать по строке пока не встретит \n, поэтому остается только первый символ с каждой строки - Я и о
Без этого цикла первый(внешний) цикл посимвольно считает строки - Я \n и щ у \n о т в е т \n.

sasha-ua
Сообщения: 2
Зарегистрирован: 12 май 2015, 19:07

Re: Буферизация консольного ввода (Код из Шилда)

Сообщение sasha-ua » 13 май 2015, 12:18

Хорошо, попробуем так, вот примитивный код:

[syntax=java]class code {
public static void main(String args[])
throws java.io.IOException {

char ch, ignore;

do {
System.out.print("Enter: ");
ch = (char) System.in.read();

// do {
// ignore = (char) System.in.read();
// } while(ignore != '\n');

System.out.println(ch + " ");
} while (ch!='q');
}
}[/syntax]

Вот его работа:

Код: Выделить всё

Enter: w
w 
Enter: 
 
Enter: 
 
Enter:
Т.е. нужно вводить буквы по одной, если введена 'q' - завершение.

Получается когда я ввожу 'w', на самом деле в буфер попадает 'w\r\n' ?
И закомментированный код это очистка буфера?
Т.е.:
1. ignore = \r
2. ignore = \n

При присвоении символов буфер очищается?

Ответить