Перейти к содержимому
Topos Uranos

Краткое содержание

Этот урок открывает седьмой раздел курса, посвящённый тексту и файлам. Он объясняет, для чего нужен раздел: научить обращаться с текстом как с данными, с его настоящей кодировкой, и добиться того, чтобы программа читала и писала файлы, не ломаясь на неправильно сформированном вводе; представляет четыре его урока и нить, которая их связывает; напоминает то, что раздел считает известным, прежде всего то, что символ для машины есть число, а также векторы, записи и функции из разделов 5 и 6; формулирует задачу, которую решает раздел, задачу программы, которая выглядит правильной, но молча теряет данные, останавливается на первой неожиданной строке и неверно измеряет имена, написанные буквами вне ASCII; заранее показывает, что буква не всегда занимает один байт; и показывает, куда он ведёт, в разделе 8 и в курсе «Программирование на C++ II».

Цели обучения

  1. Описывать последовательность содержания раздела и объяснять, что каждый урок даёт следующему.
  2. Вспомнить представление символов в виде числовых кодов (урок 2.4) и записывать код в двоичной и шестнадцатеричной системах.
  3. Заранее понять на примере, что буква не всегда есть один байт и что поэтому считать байты не значит считать буквы.
  4. Понимать, что ожидается уметь по окончании раздела, и отличать это от того, что будет изучено в следующем разделе и в курсе «Программирование на C++ II».

Входная проверка

Прежде чем проходить раздел, полезно определить исходный уровень. Эта проверка является самопроверкой: она не оценивается, и её единственная цель состоит в том, чтобы направить занятия. Первые шесть вопросов касаются того, что раздел считает известным: кода символа, записи числа в двоичной и шестнадцатеричной системах, битовой маски, обхода вектора с отбором его элементов, того, что происходит, когда чтение получает буквы вместо числа, и определения записи. Следующие четыре затрагивают, в порядке уроков, центральные идеи раздела: что возвращает поиск, который ничего не находит, размер слова с буквой вне ASCII, пустую строку, которая появляется при смешении двух способов чтения, и файл, который не удалось открыть. Никто не обязан уже сейчас правильно ответить на эти четыре вопроса, и в некоторых из них «пока не знаю» является честным ответом: каждый ответ, верный или нет, объясняет суть дела и называет урок, где она разбирается. Те же умения измеряются снова в конце, в уроке итогов.

Входная проверка

Перед началом раздела оцени свою отправную точку. Это короткая самопроверка: она не оценивается, а результат хранится только в твоём браузере.

  1. Вопрос 1Из предыдущих разделовЧто выводит std::println("{:d} {:d}", 'A', 'a');?

  2. Вопрос 2Из предыдущих разделовКак записать 233 в двоичной и шестнадцатеричной системах?

  3. Вопрос 3Из предыдущих разделовЧему равно 0xB1 & 0xC0?

  4. Вопрос 4Из предыдущих разделовЧто выводит std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);?

  5. Вопрос 5Из предыдущих разделовПосле int n{-1}; std::cin >> n; пользователь вводит abc. Чему равно n и что происходит с последующими чтениями?

  6. Вопрос 6Из предыдущих разделовКакое из следующих определений правильно объявляет запись с названием и годом?

  7. Вопрос 7Если s есть std::string s{"casa azul"};, что возвращает s.find("x")?

  8. Вопрос 8Что выводит std::println("{}", std::string{"año"}.size()); в программе, сохранённой в UTF-8, как программы этого курса?

  9. Вопрос 9Программа выполняет int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);, и пользователь вводит 36, нажимает Enter, вводит Лев и нажимает Enter. Что остаётся в name?

  10. Вопрос 10Программа выполняет std::ifstream in{"data.txt"}; int x{-1}; in >> x;, но data.txt нет в папке, из которой она запускается. Что происходит?