跳至内容
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 题在一个以 UTF-8 保存的程序中(本课程的程序都是这样),std::println("{}", std::string{"año"}.size()); 输出什么?

  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。会发生什么?