Programming in D / Перевод: Reading from the Standard Input / Чтение со стандартного ввода

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Ddoc

$(DERS_BOLUMU $(IX ввод) Чтение со стандартного ввода)

dlang 24.02.18 в 18:31

0

$(P
Все что считывает программа должно быть куда-то сохранено.

dlang 24.02.18 в 18:31

0

К примеру, программа считывающая количество учеников в классе, должна сохранить эту информацию в какую-нибудь переменную.

dlang 24.02.18 в 18:32

0

Типом этой переменной мог бы быть $(C int).
)

dlang 24.02.18 в 18:33

0

$(P
Как мы помним из предыдущей главы, если нужно что-то отправить на вывод, вовсе необязательно писать $(C stdout).

dlang 24.02.18 в 18:33

0

К тому-же, то что должно быть распечатано передается аргументом.

dlang 24.02.18 в 18:33

0

И так, чтобы распечатать значение, хранящееся в $(C studentCount), достаточно написать $(C write(studentCount)).

dlang 24.02.18 в 18:34

0

Подведем итог:
)

dlang 24.02.18 в 18:34

0

$(MONO
поток: stdout
действие: write
данные: значение переменной studentCount
получатель: обычно это окно терминала
)

dlang 24.02.18 в 18:34

0

$(P
$(IX readf) $(C write) записывает в стандартный вывод; $(C readf) обратная ей функция, она читает из стандартного ввода.

dlang 24.02.18 в 18:34

0

Буква "f" в конце названия, от английского слова "formatted" означающего - в каком-либо заранее определенном виде; то что считывает эта функция, всегда должно соответствовать какому-либо шаблону.
)

dlang 24.02.18 в 18:35

0

$(P
Из предыдущей главы нам известно что $(C stdin) это стандартный поток ввода.
)

dlang 24.02.18 в 18:35

0

$(P
При чтении данных не хватает одной части головоломки - куда же сохранять прочитанные данные.

dlang 24.02.18 в 18:39

0

Подведем итог:
)

dlang 24.02.18 в 18:41

0

$(MONO
поток: stdin
действие: readf
данные: что-либо
получатель: ?
)

dlang 24.02.18 в 18:41

0

$(P
Куда будут сохранены прочитанные данные определяется адресом переменной.

dlang 24.02.18 в 18:41

0

Адрес переменной - это то место в памяти, в котором хранится значение переменной.
)

dlang 24.02.18 в 18:42

0

$(P
$(IX &, получение адреса) Знак $(C &) написанный перед именем означает адрес того что представляет имя.

dlang 24.02.18 в 18:42

0

К примеру, $(C &studentCount) это адрес переменной $(C studentCount).

dlang 24.02.18 в 18:42

0

Так $(C &studentCount) можно прочесть как "адрес $(C studentCount)" - это и есть искомая часть головоломки:
)

dlang 24.02.18 в 18:42

0

$(MONO
поток: stdin
действие: readf
данные: что-либо
получатель: место в памяти, на которое указывает переменная studentCount
)

dlang 24.02.18 в 18:42

0

$(P
Написание знака $(C &) перед каким-либо именем означает $(I указание) на то что представляется этим именем.

dlang 24.02.18 в 18:43

0

Это основа того что называется ссылки и указатели. Мы поговорим об этом в других главах.
)

dlang 24.02.18 в 18:43

0

$(P
Позже я расскажу подробней про $(C readf). А пока будем считать, что первым аргументом $(C readf) должна быть строка $(STRING "%s"):
)

dlang 24.02.18 в 18:43

0

---
readf("%s", &studentCount);
---

dlang 24.02.18 в 18:44

0

$(P
$(C readf) вполне может работать и без знака $(C &):
)

dlang 24.02.18 в 18:44

0

---
readf("%s", studentCount); // тоже что и в примере выше
---

dlang 24.02.18 в 18:44

0

$(P
Хотя без использования знака $(C &) код лучше и безопасней, все же я продолжу применять $(C readf) к указателям, отчасти для того чтобы подготовить вас к встрече с $(LINK2 /ders/d.en/value_vs_reference.html, ссылками) и $(LINK2 /ders/d.en/function_parameters.html, особыми параметрами функций в виде ссылок).
)

dlang 24.02.18 в 18:44

0

$(P
Строка $(STRING "%s") указывает на то что данные должны быть автоматически преобразованы в значение, соответствующее типу переменной.

dlang 24.02.18 в 18:45

0

Так, при считывании знаков '4' и '2' в переменную типа $(C int), они преобразуются в число 42.
)

dlang 24.02.18 в 18:45

0

$(P
Следующая программа "спрашивает" у пользователя сколько учеников в его классе.

dlang 24.02.18 в 18:45

0

Когда укажите количество учеников, нажмите ENTER:
)

dlang 24.02.18 в 18:45

0

---
import std.stdio;

void main() {
write("Сколько у вас в классе учеников? ");

/* Объявляем переменную для хранения информации
* прочитанной из стандартного ввода. */
int studentCount;

// Сохраняем в нашу переменную данные введенные пользователем.
readf("%s", &studentCount);

writeln("Кол-во учеников: ", studentCount, ".");
}
---

dlang 24.02.18 в 18:48

0

$(H5 $(IX %s и пробельные знаками) $(IX пробельные знаки) Пропуск пробельных знаков)

dlang 24.02.18 в 18:49

0

$(P
Когда мы вводим данные и нажимаем ENTER, в поток $(C stdin) попадают введенные данные и специальный код клавиши ENTER.

dlang 24.02.18 в 18:49

0

Ведь иногда полезно знать каков был ввод - однострочный или многострочный.
)

dlang 24.02.18 в 18:49

0

$(P
Иногда специальные коды полезны, но в основном они нас не интересуют, и потому должны быть отфильтрованы от ввода.

dlang 24.02.18 в 18:50

0

Иначе они $(I заблокируют) ввод, и не дадут прочесть оставшиеся данные.
)

dlang 24.02.18 в 18:50

0

$(P
Что бы увидеть как это бывает, рассмотрим задачу когда нужно прочесть два значения - к ученикам добавить еще и учителей:
)

dlang 24.02.18 в 18:50

0

---
import std.stdio;

void main() {
write("Сколько у вас в классе учеников? ");
int studentCount;
readf("%s", &studentCount);

write("Сколько у вас в классе учителей? ");
int teacherCount;
readf("%s", &teacherCount);

writeln( "Кол-во учеников: ", studentCount, ",",
" кол-во учителей: ", teacherCount, ".");
}
---

dlang 24.02.18 в 18:52

0

$(P
К сожалению, если нужно дважды подряд получить значение типа $(C int), то это код не подойдет:
)

dlang 24.02.18 в 18:52

0

$(SHELL
Сколько у вас в классе учеников? 100
Сколько у вас в классе учителей? 20
$(SHELL_NOTE_WRONG Здесь выброшено исключение)
)

dlang 24.02.18 в 18:53

0

$(P
Когда пользователь ввел число 100 и нажал ENTER, то в поток ввода попало представление клавиши ENTER, и не смотря на то что потом в качестве числа представляющего количество учителей пользователь ввел 20, поток уже заблокирован.

dlang 24.02.18 в 18:53

0

И теперь поток ввода походит вот на что:
)

dlang 24.02.18 в 18:55

0

$(MONO
100$(HILITE [КодКлавишиEnter])20[КодКлавишиEnter]
)

dlang 24.02.18 в 18:55

0

$(P
Код клавиши ENTER что мешает вводу выделен.
)

dlang 24.02.18 в 18:56

0

$(P
И так, чтобы указать что код клавиши ENTER перед числом учителей не важен, нужно поставить знак пробела перед $(STRING %s): $(STRING " %s").

dlang 24.02.18 в 18:56

0

Пробелы в строке формата, указывают на то что нужно отсеять один и более невидимых знаков, что попадают в поток ввода.

dlang 24.02.18 в 18:56

0

К таким знакам относятся сам пробел, коды клавиши ENTER, знак табуляции, и т.п., а называются они $(I пробельные знаки) $(I (whitespace characters)).
)

dlang 24.02.18 в 18:56

0

$(P
При чтении из ввода, почти для всех данных можно писать $(STRING " %s").

dlang 24.02.18 в 18:57

0
Минутку...

Следующая страница →