본문 바로가기
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. 문제 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 파일이 없다. 무슨 일이 일어나는가?