コンテンツへスキップ
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. 問 7s が std::string s{"casa azul"}; のとき、s.find("x") は何を返すか。

  8. 問 8UTF-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 が存在しない。何が起こるか。